1

我正在尝试使用 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}}
4

3 回答 3

0

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

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

于 2018-07-02T12:41:34.657 回答
0

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

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

详解: Unity SerializeField

于 2016-11-18T23:53:50.553 回答
0

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

于 2016-02-17T20:21:53.590 回答