c# - 使用对象支持字段反序列化通用子类
问题描述
不知道如何正确命名这个问题,但这是问题所在。
public sealed class ObjectPropertySubclassTest
{
private sealed class CleverBaseClassConverter : JsonConverter<BaseClass>
{
public override bool CanWrite => false;
public override void WriteJson(JsonWriter writer, BaseClass value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override BaseClass ReadJson(JsonReader reader, Type objectType, BaseClass existingValue, bool hasExistingValue, JsonSerializer serializer)
{
var token = JToken.ReadFrom(reader);
if (token["Components"] is JArray)
{
var collection=new CollectionClass();
serializer.Populate(token.CreateReader(), collection);
return collection;
}
else
{
if (token["Value"] is JArray)
{
var obj = new SubClass<IEnumerable<BaseClass>>();
serializer.Populate(token.CreateReader(), obj);
return obj;
}
else
{
var obj = new SubClass<object>();
serializer.Populate(token.CreateReader(), obj);
return obj;
}
}
}
}
[JsonConverter(typeof(CleverBaseClassConverter))]
private abstract class BaseClass
{
public object Value { get; set; }
}
private class SubClass<T>: BaseClass
{
public new T Value
{
get => (T) base.Value;
set => base.Value = value;
}
}
private sealed class CollectionClass : SubClass<IEnumerable<BaseClass>>
{
public IEnumerable<BaseClass> Components { get=>Value; set=>Value=value; }
public bool ShouldSerializeValue() => false;
}
[Test]
public void Test()
{
var item=new CollectionClass
{
Components=new BaseClass[] {new SubClass<string>{Value="hi"},new SubClass<int>{Value=5}, }
};
var json = JsonConvert.SerializeObject(item);
var copy = JsonConvert.DeserializeObject<CollectionClass>(json);
//why does copy.components have 4 items (2 doubling up)?
//why does copy.value have 4 items (2 doubling up) as well?
}
}
Serializaiton 按预期工作,但是当我将 json 反序列化为集合类时,它最终得到 4 个项目而不是 2 个(在组件中)。我在反序列化方面做错了什么吗?还有为什么它仍然为集合类序列化“值”
JSON:(我有 json 转换器来反序列化正确的子类)
{"Components":[{"Value":"hi"},{"Value":5}],"Value":[{"Value":"hi"},{"Value":5}]}
解决方案
利用
TypeNameHandling.Auto
代替
TypeNameHandling.Object
推荐阅读
- ios - 如何从 ARKit 中的节点动画到实际视图
- c++ - 如何及早捕获浮点错误(就在它们发生的地方)?
- c# - 从对象中删除事件引用以使垃圾收集工作
- python - 对一个单元格的内容使用字典键来使用相关值填充新列的单元格
- c++ - 是否有一个函数可以将每个双精度转换为唯一的 uint64_t,保持精度和 ORDER?(为什么我找不到?)
- c++ - 数组中最大值的C ++ if语句未指向正确的元素
- c# - 如何在事件处理程序中多次更新 UI 元素?
- android - 即使我已经从 Android Manifest 中删除了权限,仍然在 Google Play Store 上收到警告说该应用程序将被删除
- python - 通知用户后即使出错也继续
- javascript - 剪贴板在退出时清除