c# - 如何解决“Newtonsoft.Json.JsonSerializationException 无法找到用于类型的构造函数”Android 错误?
问题描述
我正在使用 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-使用-link.xml
要详细了解这是为什么,请参阅我的解释页面:https ://github.com/jilleJr/Newtonsoft.Json-for-Unity/wiki/What-even-is-AOT
推荐阅读
- javascript - 如何使用正则表达式找到重复的字符对?
- c++ - ncurses 是否可以将字段 form.h 添加到面板 panel.h?
- c++ - 为什么使用 Eigen 密集动态矩阵的 setZero 比静态矩阵更快?
- python - 如何增加分组条之间的间距
- python - 我需要结合使用 SQLAlchemy 和 Graphene 编写查询
- ios - RCTEventEmitter 未发出事件以响应本机
- actionscript-3 - 带有滚动事件处理程序的基于 mx 或 spark 的滚动器的示例
- javascript - 使用带有和溢出的网格时如何防止出现整体滚动条
- node.js - 使用 React 从快速服务器的自定义 URL 获取数据
- android - 如何在同一活动上飞溅 gif 几秒钟