【问题标题】:Json.Net error in XCODE - System.Reflection.EmitXCODE 中的 Json.Net 错误 - System.Reflection.Emit
【发布时间】:2015-11-28 11:02:10
【问题描述】:

我想反序列化 iOS 上的 JSON 文件,并为此使用了 Json.Net。但是当应用程序在 XCODE 模拟器中运行时,它给了我关于 System.Reflection.Emit 的错误,似乎 XCODE 不允许在应用程序中使用该库。 我猜想当反射试图将值放入指定类型的字段时,它正在使用反射。 我可以避免吗?而不是我想创建类似 JSONObject 的东西,一个带有键和字段的字典。 我想这种方法可以让我正确反序列化 JSON,没有任何例外。

【问题讨论】:

    标签: ios json xcode unity3d json.net


    【解决方案1】:

    我能够使用Newtonsoft.Json 版本 11.0.2 进行 序列化(未测试反序列化)与 IL2CPP 和 iOS 与以下 link.xml

    <linker>
        <assembly fullname="System">
            <type fullname="System.ComponentModel.TypeConverter" preserve="all"/>
            <type fullname="System.ComponentModel.ArrayConverter" preserve="all"/>
            <type fullname="System.ComponentModel.BaseNumberConverter" preserve="all"/>
            <type fullname="System.ComponentModel.BooleanConverter" preserve="all"/>
            <type fullname="System.ComponentModel.ByteConverter" preserve="all"/>
            <type fullname="System.ComponentModel.CharConverter" preserve="all"/>
            <type fullname="System.ComponentModel.CollectionConverter" preserve="all"/>
            <type fullname="System.ComponentModel.ComponentConverter" preserve="all"/>
            <type fullname="System.ComponentModel.CultureInfoConverter" preserve="all"/>
            <type fullname="System.ComponentModel.DateTimeConverter" preserve="all"/>
            <type fullname="System.ComponentModel.DecimalConverter" preserve="all"/>
            <type fullname="System.ComponentModel.DoubleConverter" preserve="all"/>
            <type fullname="System.ComponentModel.EnumConverter" preserve="all"/>
            <type fullname="System.ComponentModel.ExpandableObjectConverter" preserve="all"/>
            <type fullname="System.ComponentModel.Int16Converter" preserve="all"/>
            <type fullname="System.ComponentModel.Int32Converter" preserve="all"/>
            <type fullname="System.ComponentModel.Int64Converter" preserve="all"/>
            <type fullname="System.ComponentModel.NullableConverter" preserve="all"/>
            <type fullname="System.ComponentModel.SByteConverter" preserve="all"/>
            <type fullname="System.ComponentModel.SingleConverter" preserve="all"/>
            <type fullname="System.ComponentModel.StringConverter" preserve="all"/>
            <type fullname="System.ComponentModel.TimeSpanConverter" preserve="all"/>
            <type fullname="System.ComponentModel.UInt16Converter" preserve="all"/>
            <type fullname="System.ComponentModel.UInt32Converter" preserve="all"/>
            <type fullname="System.ComponentModel.UInt64Converter" preserve="all"/>
        </assembly>
    
        <!--https://docs.microsoft.com/en-us/dotnet/api/system.linq.expressions.lambdaexpression.name?view=netframework-4.7.2&viewFallbackFrom=netframework-2.0-->
        <assembly fullname="System.Core">
            <type fullname="System.Linq.Expressions" preserve="all"/>
            <type fullname="System.Linq.Expressions.*" preserve="all"/>
            <type fullname="System.Linq.Expressions.Interpreter.LightLambda" preserve="all"/>
            <type fullname="System.Linq.Expressions.LambdaExpression" preserve="all"/>
        </assembly>
        <assembly fullname="System.Linq.Expressions">
            <type fullname="System.Linq.Expressions" preserve="all"/>
            <type fullname="System.Linq.Expressions.*" preserve="all"/>
            <type fullname="System.Linq.Expressions.Interpreter.LightLambda" preserve="all"/>
            <type fullname="System.Linq.Expressions.LambdaExpression" preserve="all"/>
        </assembly>
        <assembly fullname="netstandard">
            <type fullname="System.Linq.Expressions" preserve="all"/>
            <type fullname="System.Linq.Expressions.*" preserve="all"/>
            <type fullname="System.Linq.Expressions.Interpreter.LightLambda" preserve="all"/>
            <type fullname="System.Linq.Expressions.LambdaExpression" preserve="all"/>
        </assembly>
    </linker>
    

    不过,您可能会摆脱其中的一些。我用来序列化的类型是 .NET SDK for Sentry 的一部分。 source is here.

    【讨论】:

    • 感谢 Bruno 的回答,我们能够克服构建中出现的问题,这些问题仅在我们以 iOS 为目标时才会出现。异常和堆栈跟踪可能难以解释和误导,因为我们收到 JsonSerializationException 引用设置 JSON 字符串被反序列化到的类的成员时出错。在我们甚至无法序列化一个简单类的实验之后,我们开始投资系统和兼容性问题并遇到了这个答案。在仔细检查堆栈跟踪后,我们可以看到一些对 LINQ 中构造函数错误的引用
    【解决方案2】:

    您应该尝试使用 miniJSON(我目前的选择)或 JsonFX 以获得对 Unity3D 平台的全面支持。 至于 iOS,大多数 Unity3D 移动开发者推荐使用 JsonFX 来处理更大的数据块。

    miniJSON: @ GitHub

    JsonFX: @ Bitbucket

    使用 JsonFX 进行序列化的示例(来自 raybarrera.com 博客*):

    public string fileName;
    public Sandwich sandwich;
    
    private string PATH;
    
    private void Start() {
        PATH = Application.dataPath + "/../testData/";
    }
    private void OnGUI()   {
        if (GUILayout.Button("SAVE")){
            SerializeAndSave();
        }
    }
    
    private void SerializeAndSave() {
        string data = JsonWriter.Serialize(sandwich);
        if(!Directory.Exists(PATH)){
            Directory.CreateDirectory(PATH);
        }
        var streamWriter = new StreamWriter(PATH + fileName + ".txt");
        streamWriter.Write(data);
        streamWriter.Close();
    }
    

    *http://www.raybarrera.com/2014/05/18/json-deserialization-using-unity-and-jsonfx/

    【讨论】:

    • 我已经尝试过 miniJSON 和 JsonFX,但它们无法反序列化下一个 JSON 文件 pastebin.com/MDKSPxyR,这是我在将指定对象序列化为字符串 pastebin.com/AD7qE0GN 后得到的 JSON。结构看起来相同,但两个库都无法反序列化第一个 JSON 文件。
    • 你能分享你正在序列化的课程吗?没有它就无法测试。
    • 我使用的是ChapterModel的List,ChapterModel包含PageModel的列表,这里是这两个类pastebin.com/ajQP97WN
    • 我已经回答了你的第二个相关问题。如果它解决了您的问题,请标记为已回答以关闭主题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多