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

问题描述 投票:0回答:2

我正在使用Unity3D在App中工作。

我使用带有某些类的我自己的实用程序DLL。

我已经工作了几个月,并且进行了许多构建/编译,没有问题。

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

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

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

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

新类具有的唯一不同的想法是namespacetype。变量,方法和构造函数仍然相同。

同样重要的是,该项目在PC上可以正常运行,该问题仅在Android中出现。

我知道我可以对我的班级进行一些自定义反序列化或添加标签等。但事实是,只有那个类才引起问题,并且没有理由更改JSon反序列化系统。

谢谢。

c# android unity3d dll json.net
2个回答
0
投票
  1. 您可以在类中有一个空的构造函数,以便对其进行反序列化。

  2. 您可以尝试将其放在您的课​​程中:

    [Runtime.Preserve(AllMembers = true)]


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.