递归序列化错误:Recursive Serialization is not supported. You can‘t dereference a PPtr while loading.

递归!序列化!错误!这个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来快速定位到出现问题的地方。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值