unity3d 未调用ReadJson

bsxbgnwa  于 2023-04-21  发布在  其他
关注(0)|答案(2)|浏览(111)

我想要实现的。我有一个类,其中有一些属性/对象。我只想用我的自定义序列化器序列化那些满足CanConvert条件的对象,其他的应该默认处理。
问题是[JsonConverter(typeof(UnityObjectConverter))]序列化正确,但反序列化失败。可能是因为我只保存了对象的路径,而不是整个对象,当一些内部检查(我不知道为什么)发生时,它失败并返回null,因为ReadJson从未被调用。
当我使用设置时,它给我带来了更多的问题,它解决了,因为它没有序列化其余的。我不想对整个类进行序列化,因为那样的话它就不是很通用,因为几个对象继承了这个类。类本身不是抽象的,所以可能有一些对象只使用这个类。如果有人能帮助我,我会很高兴。谢谢

public class UnityObjectConverter : JsonConverter {

public override bool CanConvert(Type objectType) {
    Debug.Log(objectType.BaseType == typeof(UnityEngine.Object));
    return objectType.BaseType == typeof(UnityEngine.Object);
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
    Debug.Log("read");
    return UnityEditor.AssetDatabase.LoadAssetAtPath(reader.ReadAsString(), objectType);
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
    Debug.Log("write");
    var item = (UnityEngine.Object)value;
    writer.WriteValue(UnityEditor.AssetDatabase.GetAssetPath(item));
    writer.Flush();
}

public override bool CanRead {
    get {
        return true;
    }
}

public override bool CanWrite {
    get {
        return true;
    }
}
 }

属性示例

/// <summary>
    /// GameObject if item is needed to be visualised
    /// </summary>
    [JsonConverter(typeof(UnityObjectConverter))]
    public GameObject gameObject { get { return _gameObject; } private set { _gameObject = value; } }
    protected GameObject _gameObject = null;

反序列化/序列化示例

public static void Add(Item i) {
        items.Add(i);
        if (!System.IO.File.Exists(Application.dataPath + DATA_PATH))
            System.IO.File.Create(Application.dataPath + DATA_PATH).Close();
        using (System.IO.StreamWriter sw = System.IO.File.CreateText(Application.dataPath + DATA_PATH)) {
            sw.Write(JsonConvert.SerializeObject(items));
        }
    }

static void Load() {
        items.Clear();
        Item[] it = JsonConvert.DeserializeObject<Item[]>(System.IO.File.ReadAllText(Application.dataPath + DATA_PATH));
        if (it != null)
            items.AddRange(it);
    }
3hvapo4f

3hvapo4f1#

当我做这类事情时,我创建了一个JsonSerializerSettings对象

var settings = new JsonSerializerSettings
 {
     ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
     DefaultValueHandling = DefaultValueHandling.Ignore,
     NullValueHandling = NullValueHandling.Ignore
 };
 settings.Converters.Add(new Converter());

然后将其传递给反序列化器

var json = textReader.ReadToEnd();
 return JsonConvert.DeserializeObject<T>(json, settings);
aoyhnmkz

aoyhnmkz2#

我遇到了同样的问题,使用MyObjectConverter : JsonConverter<MyObject>而不是MyObjectConverter : JsonConverter帮助了我
另外,不要忘记在JsonConvert.DeserializeObject<T>(json, new MyObjectConverter ())的反序列化参数中指定转换器

相关问题