求助:Unity JsonUtility无法序列化自定义类嵌套字段的原因
Unity 2019.1中JsonUtility无法序列化嵌套结构体的问题解决
你的问题出在Unity 2019.1版本的JsonUtility对嵌套结构体的序列化支持上——当根对象是包含自定义结构体字段的结构体时,即使所有类型都标记了[Serializable],嵌套字段也无法被正确序列化,而单个结构体的序列化不受影响,这是该版本的已知行为限制。
解决方案
这里提供三种可行的修复方式:
1. 将根结构体改为类
把Foo从结构体改为类,即可正常序列化嵌套字段:
[Serializable] struct Bar { public string baz; } [Serializable] class Foo { // 修改为class public Bar bar; }
测试代码无需修改,此时序列化Foo会输出正确的JSON:{"bar":{"baz":"testing"}}。
2. 用包装类包裹根结构体
如果必须保留Foo为结构体,可以创建一个类来包裹它:
[Serializable] struct Bar { public string baz; } [Serializable] struct Foo { public Bar bar; } [Serializable] class FooWrapper { public Foo foo; }
测试时序列化包装类实例:
var foo = new Foo(); var bar = new Bar(); bar.baz = "testing"; foo.bar = bar; var wrapper = new FooWrapper { foo = foo }; Debug.Log("Foo json serialization: " + JsonUtility.ToJson(wrapper));
输出结果为{"foo":{"bar":{"baz":"testing"}}},嵌套数据被正确序列化。
3. 升级Unity版本
该嵌套结构体序列化的问题在Unity 2019.3及后续版本中已被官方修复,如果项目允许升级,直接更新到更高版本即可无需修改代码解决问题。
原因说明
Unity的JsonUtility基于内部序列化系统实现,2019.1版本对结构体嵌套的处理逻辑存在局限:当根对象是结构体时,系统无法正确遍历并序列化其内部的结构体字段;而单个结构体或结构体作为类的字段时,序列化逻辑可以正常运行。
内容的提问来源于stack exchange,提问作者des54321
相关产品推荐
相关产品推荐

