gpt4 book ai didi

c# - AOT 设备中的 Json.Net 反序列化是否需要空构造函数?

转载 作者:行者123 更新时间:2023-12-04 15:56:21 29 4
gpt4 key购买 nike

我已经在我的项目中多次使用 Json.Net 来保存数据,并且从不担心为我的序列化类创建无参数构造函数。
现在我正在做一个适合这种情况的项目。它使用 Json.Net 序列化一些没有无参数构造函数的类,并且工作正常。然而,一位同事警告我说我很幸运从来没有遇到任何问题,而且错误ExecutionEngineException: Attempting to JIT compile method可能会在 iOS 版本中随时出现并使我的应用程序崩溃。
我看过很多关于 Json.Net 和构造函数或 Json.Net 和 AOT 的话题,但对 Json.Net、构造函数和 AOT 一无所知。至少本世纪没有。
所以,我的问题是,我应该担心 iOS 设备中没有无参数构造函数的序列化类吗?
编辑:我的类有构造函数,但它们接收参数。我想知道我是否需要除了它们之外没有参数的构造函数。

最佳答案

正如评论中提到的,您应该害怕的是字节码剥离,而不是有关默认构造函数数量的任何事实。
Newtonsoft.Json 用于实例化类型的反射部分是不可避免的,因此为了保护所有类免遭字节码剥离,您有几个选择。

任一:通过 link.xml 禁用字节码剥离文件。例子:

<linker>
<assembly fullname="MyAssembly">
<type fullname="MyAssembly.MyCSharpClass" />
</assembly>
</linker>
我发现 Unity 的官方文档分散且缺乏,所以我重写了几个文档。
阅读有关如何使用 link.xml 的更多信息文件在这里: https://github.com/jilleJr/Newtonsoft.Json-for-Unity/wiki/Fix-AOT-using-link.xml
^基于对 UnityLinker 和现有文档的行为进行逆向工程。如需进一步阅读,请访问:
  • https://docs.unity3d.com/Manual/ManagedCodeStripping.html
  • https://docs.unity3d.com/Manual/IL2CPP-BytecodeStripping.html

  • 选项 2:通过 Preserve 禁用字节码剥离属性。
    向您的类、方法、字段、属性、事件或程序集添加属性将保证它不会被 UnityLinker 剥离。该属性必须命名为 PreserveAttribute ,所以使用 UnityEngine.Scripting.PreserveAttribute或者你自己的一个名为 PreserveAttribute 的属性将产生相同的结果。
    using UnityEngine.Scripting;

    [Preserve]
    public class YourTypeWithSpecialConstructor
    {
    public YourTypeWithSpecialConstructor(int value1, string value2)
    {
    }
    }
    阅读更多关于 Preserve属性用法: https://docs.unity3d.com/ScriptReference/Scripting.PreserveAttribute.html (这个我没有重写:p)

    选项 3:使用我发布的 Newtonsoft.Json for Unity 中的 AotHelper。
    Assets Store 上的 JSON .NET for Unity 包基于 Newtonsoft.Json 8.0.3,但是在撰写本文时,我的当前是最新的 Newtonsoft.Json 12.0.3,并通过 Unity Package Manager 交付给更容易保持最新状态:
    https://github.com/jilleJr/Newtonsoft.Json-for-Unity#readme
    它包括 Newtonsoft.Json.Utilities。 AotHelper 类,它不仅禁用字节码剥离,还强制编译某些类型,这对于泛型非常有益。用法示例:
    using Newtonsoft.Json.Utilities;
    using UnityEngine;

    public class AotTypeEnforcer : MonoBehaviour
    {
    public void Awake()
    {
    AotHelper.Ensure(() => {
    _ = new YourGenericTypeWithSpecialConstructor<int>(0, null);
    _ = new YourGenericTypeWithSpecialConstructor<float>(0, null);
    _ = new YourGenericTypeWithSpecialConstructor<string>(null, null);
    _ = new YourGenericTypeWithSpecialConstructor<bool>(true, null);
    });
    }
    }

    public class YourGenericTypeWithSpecialConstructor<T>
    {
    public YourGenericTypeWithSpecialConstructor(T value1, string value2)
    {
    }
    }
    在此处阅读有关如何使用 AotHelper 的更多信息: https://github.com/jilleJr/Newtonsoft.Json-for-Unity/wiki/Fix-AOT-using-AotHelper

    关于c# - AOT 设备中的 Json.Net 反序列化是否需要空构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51453365/

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