gpt4 book ai didi

c# - 如何解决 "Newtonsoft.Json.JsonSerializationException unable to find constructor to use for types"Android 错误?

转载 作者:行者123 更新时间:2023-12-04 23:46:18 27 4
gpt4 key购买 nike

我正在使用 Unity3D 开发应用程序。

我使用我自己的实用程序 DLL 和一些类。

我已经工作了几个月,并且毫无问题地进行了很多构建/编译。

上周向 DLL 添加了一个新类,它在我的 PC 上运行良好,但是当我构建项目并在我的 Android 设备中使用它时,它停止了工作。 Android Monitor 程序向我显示了该错误:

“Newtonsoft.Json.JsonSerializationException 无法找到用于类型的构造函数”

Newtonsoft 可以为其找到构造函数的类型是我最近添加的新类。

重要 :所有其他类都被反序列化,没有错误。

新类唯一不同的想法是 命名空间 类型 .变量、方法和构造函数还是一样的。

该项目在 PC 上运行良好也很重要,该问题仅在 Android 中出现。

我知道我可以做一些自定义反序列化程序或添加标签等。我的类(class)。但问题是只有那个类会导致问题,没有理由改变 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

关于c# - 如何解决 "Newtonsoft.Json.JsonSerializationException unable to find constructor to use for types"Android 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59757635/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com