我正在使用Unity3D开发应用程序。
我在某些类中使用自己的实用程序DLL。
我已经工作了几个月,并且进行了许多构建/编译,没有问题。
上周向DLL添加了一个新类,它在我的PC上运行良好,但是当我构建该项目并在我的Android设备上使用它时,它停止工作。Android Monitor程序向我显示该错误:
“ Newtonsoft.Json.JsonSerializationException无法找到用于类型的构造函数”
Newtonsoft可以为其找到构造函数的类型是我最近添加的新类。
重要说明:所有其他类均已反序列化,没有错误。
新类具有的唯一不同之处是名称空间和类型。变量,方法和构造函数仍然相同。
该项目在PC上正常运行也很重要,该问题仅在Android中出现。
我知道我可以对我的班级进行一些自定义反序列化或添加标签等操作。但是事实是,只有那个类会导致问题,并且没有理由更改JSon反序列化系统。
谢谢。
背景:这是一个普遍的问题,源于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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句