首页 > 解决方案 > 如何解决“Newtonsoft.Json.JsonSerializationException 无法找到用于类型的构造函数”Android 错误?

问题描述

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

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

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

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

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

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

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

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

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

我知道我可以做一些自定义反序列化程序或添加标签等。我的班级。但问题是只有那个类会导致问题,没有理由改变 JSon 反序列化系统。

谢谢你。

标签: c#androidunity3ddlljson.net

解决方案


背景:这是源于 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


推荐阅读