情景再现
假设你有如下类:
public class Item {
public int Id;
public string Name;
}
public class Weapon: Item {
public int CurrentAmmo;
}
public class Inventory {
public List<Item> Items;
}
其中你序列化的是Inventory类,Items列表里混杂着Weapon和Item,这里假定Json字符串已经正确输出。
在反序列化的过程中,你的Weapon数据并没有转换成Item,因为Items已经是显式指明了List<Item>,被Populate的实例已经明确为Item,你无法把被当成Item的Weapon强转回Weapon。
解决办法
创建一个JsonConverter,在ReadJson中读一次Json,找特定标志(比如CurrentAmmo),根据标志是否存在来创建对应类的实例。
namespace InventorySystem.Utilities
{
public class ItemConverter : JsonConverter<Item>
{
public override void WriteJson(JsonWriter writer, Item value, JsonSerializer serializer){}
public override Item ReadJson(JsonReader reader, Type objectType, Item existingValue, bool hasExistingValue,
JsonSerializer serializer)
{
var jObj = JObject.Load(reader);
if (jObj["CurrentAmmo"] != null)
{
return GetItem<Weapon>(jObj);
}
return GetItem<Item>(jObj);
}
private T GetItem<T>(JObject obj)
{
return obj.ToObject<T>();
}
}
}
现在你可以在反序列化后顺利的把被当成Item的Weapon强转成Weapon了。
鸣谢
AStar