Unity Json.Net:错误设置值

时间:2018-02-01 11:16:27

标签: unity3d json-serialization

我正在尝试创建一个方便的资产对象序列化引用。它序列化正确,但反序列化失败,异常

  

“在'TestData'上将值设置为'textAssetRef'时出错。”

我为Unity准备了一个小测试组件来说明这一点:

using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using UnityEditor;
using UnityEngine;

public class Test : MonoBehaviour
{
    public TestData testData;

    public void Awake()
    {
        try
        {
            var sData = JsonConvert.SerializeObject(testData, Formatting.Indented);
            UnityEngine.Debug.Log(sData);
            testData = JsonConvert.DeserializeObject<TestData>(sData);
            UnityEngine.Debug.Log("Done.");
        }
        catch (Exception x)
        {
            UnityEngine.Debug.LogError(x.Message);
        }
    }
}


[Serializable]
public class TestData
{
    public TextAssetRef textAssetRef;
}


[Serializable]
[JsonConverter(typeof(Serialization))]
public class TextAssetRef : ObjectRef<TextAsset>
{
    public TextAssetRef() { }
    public TextAssetRef(TextAssetRef other) : base(other) { }
    public TextAssetRef(TextAsset ta) : base(ta) { }
}


[Serializable]
public class ObjectRef<T> where T : UnityEngine.Object
{
    public T obj;

    public ObjectRef() { }
    public ObjectRef(ObjectRef<T> other) { obj = other.obj; }
    public ObjectRef(T obj) { this.obj = obj; }


    public class Serialization : JsonConverter
    {
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            var objRef = (ObjectRef<T>)value;
            var jObject = new JObject { { "path", AssetDatabase.GetAssetPath(objRef.obj) } };
            serializer.Serialize(writer, jObject);
        }

        public override bool CanConvert(Type objectType) { return objectType == typeof(ObjectRef<T>); }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            var jObject = JObject.Load(reader);
            var assetPath = jObject.GetValue("path").Value<string>();
            return new ObjectRef<T> { obj = AssetDatabase.LoadAssetAtPath<T>(assetPath) };
        }
    }
}

要重现错误,只需在Unity中使用JSON.Net资产包创建一个新项目,在场景中创建空对象,将此Test组件放在其上并按Play。

我该怎么做才能正确反序列化?

0 个答案:

没有答案