gpt4 book ai didi

c# - 未调用 ReadJson

转载 作者:行者123 更新时间:2023-11-30 17:43:27 25 4
gpt4 key购买 nike

我想要实现的目标。我有一个类,其中有一些属性/对象。我只想用我的自定义序列化程序序列化那些满足 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);
}

最佳答案

当我做这类事情时,我创建了一个 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);

关于c# - 未调用 ReadJson,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30867254/

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