我正在使用Unity3D在App中工作。
我使用带有某些类的我自己的实用程序DLL。
我已经工作了几个月,并且进行了许多构建/编译,没有问题。
上周向DLL添加了一个新类,它在我的PC上运行良好,但是当我构建该项目并在Android设备上使用它时,它停止工作。 Android Monitor程序向我显示该错误:
“ Newtonsoft.Json.JsonSerializationException无法找到要用于类型的构造函数”
Newtonsoft可以为其找到构造函数的类型是我最近添加的新类。
重要:所有其他类都已反序列化,没有错误。
新类具有的唯一不同的想法是namespace和type。变量,方法和构造函数仍然相同。
同样重要的是,该项目在PC上可以正常运行,该问题仅在Android中出现。
我知道我可以对我的班级进行一些自定义反序列化或添加标签等。但事实是,只有那个类才引起问题,并且没有理由更改JSon反序列化系统。
谢谢。
您可以在类中有一个空的构造函数,以便对其进行反序列化。
您可以尝试将其放在您的课程中:
[Runtime.Preserve(AllMembers = true)]
Background:这是一个常见问题,源于UnityLinker的字节码剥离算法。发生的是,UnityLinker无法看到对类型构造函数的任何使用(因为Newtonsoft.Json仅通过反射来使用它,而编译器无法预见),因此将其删除。仅当使用IL2CPP脚本后端进行构建时,才会激活此字节码剥离,这就是为什么在PC上构建(或其他仅使用Mono的情况下)构建时不会遇到任何问题的原因。
修复:为了克服这个问题,您可以禁用该类型的字节码剥离(甚至仅禁用该构造函数)。您可以使用link.xml
文件执行此操作。示例:
<linker>
<assembly fullname="MyAssembly">
<type fullname="MyAssembly.MyCSharpClass">
<!-- disables stripping just for the constructor -->
<method signature="System.Void .ctor()"/>
</type>
<!-- disables stripping for the entire type -->
<type fullname="MyAssembly.MyCSharpClass" preserve="all" />
</assembly>
</linker>
我写了一些关于使用link.xml
以及其他工具来解决AOT问题的有用页面,因为我发现Unity的文档缺乏而且分散:https://github.com/jilleJr/Newtonsoft.Json-for-Unity/wiki/Fix-AOT-using-link.xml
要详细了解这是为什么,请参阅我的说明页:https://github.com/jilleJr/Newtonsoft.Json-for-Unity/wiki/What-even-is-AOT