XCODE中的Json.Net错误 - System.Reflection.Emit

时间:2015-11-28 11:02:11

标签: ios json xcode unity3d json.net

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

2 个答案:

答案 0 :(得分:0)

您应该尝试使用miniJSON(我当前的选择)或JsonFX来完全支持Unity3D平台。 至于iOS,大多数Unity3D移动开发者都推荐JsonFX用于更大的数据块。

miniJSON: @ GitHub

JsonFX: @ Bitbucket

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

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/

答案 1 :(得分:0)

我可以使用带有以下 link.xml 的IL2CPP和iOS将Newtonsoft.Json版本11.0.2用于序列化(未测试反序列化) :

<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