【发布时间】:2023-02-02 18:36:58
【问题描述】:
这是一个列表,它的类型是一个抽象类:
List<AbstractClass> mainList
在此列表中,我将保存从AbstractClass 继承的不同类型。
mainList.Add(InheritedClassA);
mainList.Add(InheritedClassB);
现在我已经为它写了一个 Custom JsonConverter:
public class CustomConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(List<AbstractClass>);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var obj = reader.Value as List<AbstractClass>;
return serializer.Deserialize(reader, typeof(List<AbstractClass>));
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var list = value as List<AbstractClass>;
if (list.Count > 0)
{
if ((value as List<AbstractClass>)[0] is InheritedClassA)
{
List<InheritedClassA> raw = new List<InheritedClassA>();
foreach (var o in list)
raw.Add(o as InheritedClassA);
serializer.Serialize(writer, raw);
}
if ((value as List<AbstractClass>)[0] is InheritedClassB)
{
List<StandardRequestObject> standard = new List<InheritedClassB>();
foreach (var o in list)
standard.Add(o as InheritedClassB);
serializer.Serialize(writer, standard);
}
}
}
}
Write 方法会工作得很好,它会正确保存数据,但 Read 方法不能。读者的价值是空的!我的意思是在任何转换之前它是空的。什么都没有!
哪里有问题?我该如何解决?
【问题讨论】:
-
您的意思是“reader.value”值为 null 而不是“reader”值?转换后因为它不是 List<AbstractClass> 但可能是来自 json 的字符串?是什么告诉调试器“reader.value”的类型?
-
List<Z>不是List<X>,即使Z派生自X也永远不会。有两种不同的类型,as运算符将返回null -
也读取将无法工作,因为反序列化器无法猜测没有类型鉴别器的类型(为什么它有 +1?我们不知道什么 json 被反序列化以及没有 MVCE 的类型......非常奇怪的投票模式和主持人应该采取看)
-
@Selvin 我想我问了一个合理的问题。它与反序列化有关。如果您不知道答案,并不意味着这是一个糟糕的问题。