【问题标题】:Unity: Handling inheritance with JSONUtility.ToJSONUnity:使用 JSONUtility.ToJSON 处理继承
【发布时间】:2016-02-17 19:32:38
【问题描述】:

我正在尝试使用 Unity 5.3.2 中包含的新 JSONUtility 来序列化包含作为基类后代的对象的对象。这是一个例子:

[Serializable]
public class Class1
{
    public int class1Field = 1;
    public Class2 attributes = new Class3();
}
[Serializable]
public class Class3 : Class2
{
    public int class3Field = 3;
}
[Serializable]
public class Class2
{
    public int class2Field = 2;
}

如果我这样做:

Class1 myClass = new Class1();
Debug.Log(JsonUtility.ToJson(myClass));

输出是:

{"class1Field":1,"attributes":{"class2Field":2}}

如您所见,Class3 中的任何内容都没有被序列化。有趣的是,如果我这样做:

Debug.Log(JsonUtility.ToJson(myClass.attributes));

输出是:

{"class2Field":2,"class3Field":3}

这是我所期望的。我知道我可以使用 string.Format 做一个非常简单的解决方法,但是有没有更优雅的解决方案来解决这个问题?我可能没有正确使用 JSONUtility 吗?还是 JSONUtility 目前根本不支持?

我正在研究此功能,因为我正在使用反射生成一个对象(在本例中将替换“Class3”),然后序列化反射对象所属的顶级对象。

要清楚,我想要的输出是:

{"class1Field":1,"attributes":{"class2Field":2,"class3Field":3}}

【问题讨论】:

    标签: c# json inheritance unity5.3


    【解决方案1】:

    您是否尝试直接从 JSON 中读取值? JSON 序列化的预期用途是在您需要再次读取它时将其反序列化(到对象)。您应该调用JsonUtility.FromJson(string) 以便从继承的类中重新读取数据。

    【讨论】:

    • 我正在尝试将值序列化为 JSON(很抱歉在这方面不清楚)。我的问题是我从 ToJSON 方法获得的 JSON 对象没有考虑从基类派生的对象中的字段。
    • 也许尝试使用不同的序列化方法?您可以尝试使用 Newtonsoft.JSON,我已经将它与继承一起使用,但我不太记得它是否保留了值。
    【解决方案2】:

    抱歉最近的回答。您只是错过了在“属性”字段中键入关键字 [SerializeField]。 Unity 无法序列化引用类型字段。 (如类、自定义类、游戏对象、MonoBehaviour...)。对于序列化,它必须是一个值类型(int,float ..)。 但是您仍然想对其进行序列化,然后应该添加 [SerializeField] 关键字属性字段,并且您还要小心使用该关键字。

    [Serializable] 
    public class Class1
    {
    public int class1Field = 1;
    [SerializeField]
    public Class2 attributes = new Class3();
    }
    

    详细解释: Unity SerializeField

    【讨论】:

      【解决方案3】:

      据我了解,我已经为此搜索了论坛。您无法使用 Unity 的 JSONUtility 处理开箱即用的多态类型。

      推荐的方法包括,使用 SharpSerializer、OdinInspector、JSON.Net。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-02
        • 1970-01-01
        • 2017-01-28
        • 2011-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-30
        相关资源
        最近更新 更多