序列化对象时,我有一个List<T>
属性,其中T
是一个抽象类型,我想自然地序列化。但是,在反序列化对象时,我希望/需要手动反序列化此抽象列表。我使用自定义JsonConverter
来执行后一部分,该自定义class MyObject {
public Guid Id;
public string Name;
public List<MyAbstractType> Things;
}
查看每个项目的属性
在列表中,然后将其反序列化为正确的类型并将其放在列表中。
但是我还需要反序列化对象的其余部分,而不是逐个属性。伪代码如下。
为MyObject
class MyObjectConverter : JsonConverter {
public override object ReadJson(reader, ..., serializer) {
// Line below will fail because the serializer will attempt to deserlalize the list property.
var instance = serializer.Deserialize(reader);
var rawJson = JObject.Load(reader); // Ignore reading from an already-read reader.
// Now loop-over and deserialize each thing in the list/array.
foreach (var item in rawJson.Value<JArray>(nameof(MyObject.Things))) {
var type = item.Value<string>(nameof(MyAbstractType.Type));
MyAbstractType thing;
// Create the proper type.
if (type == ThingTypes.A) {
thing = item.ToObject(typeof(ConcreteTypeA));
}
else if (type == ThingTypes.B) {
thing = item.ToObject(typeof(ConcreteTypeB));
}
// Add the thing.
instance.Things.Add(thing);
}
return instance;
}
}
MyObjectConverter
Things
总结一下,我想手动处理sw-precache
的反序列化,但允许它们自然地序列化。