递归!序列化!错误!这个bug不简单,看着就感觉很牛皮。
报错信息:Recursive Serialization is not supported. You can’t dereference a PPtr while loading. (Constructors of C# classes may not load objects either. See stacktrace.)
总的来说就是:Unity不支持递归序列化
出现情况:
(一)有一个可序列化的类:Class1;在Class1中引用了Class1。例如:
[System.Serializable]
public class Class1
{
//像List集合一样引用 造成递归序列化错误
public List<Class1> c1List;
//或是直接引用 也会造成这个错误
//public Class1 c1;
}
(二)有一个可序列化的类:Class1;还有一个可序列化的类:Class2;在Class1中引用了Class2,而Class2中引又用了Class1。也会造成序列化错误。例如:
[System.Serializable]
public class Class1
{
//像List集合一样的引用Class2
public List<Class2> c2List;
//或是直接引用
//public Class2 c2;
}
[System.Serializable]
public class Class2
{
//像List集合一样的引用Class1
public List<Class1> c1List;
//或是直接引用
//public Class1 c1;
}
像上面的两种情况,就造成了递归序列化,且最大的序列化深度为7,而Unity的序列化无法处理这种潜在的无限序列化数据,
Unity 2017之前,递归序列化也只是一个Warning,,
而在Unity2017之后,就是Error了,而且在Unity编译器环境下,这个错误不会影响运行效果,但是当你打包时,就会出现并且打包失败,只能去解决。
解决方案:
(1)序列话最大的作用无非就是可以在编译器属性面板中观察或者改变其数值,你可以重写该部分代码已删除递归序列化的引用。
(2)将项目回滚到Unity2017之前的版本,在那时这只是一个警告,且不会影响打包。
PS:如果在 解决 这个问题时,项目中已经有了大量的序列话递归的情况了,这将花费大量的时间去寻找代码。而在Unity编译器的Console面板中,可以根据warning来快速定位到出现问题的地方。