这个问题主要针对我的特定问题,但是我觉得这里有一个更大的问题需要解决。
我正在尝试使用JSON.NET库将复杂的JSON类型反序列化为带有继承树的.NET对象模型。由于无法在编译时确定文档的类型,因此我编写了自己的转换器,该转换器根据JSON属性值确定类型。
为了简短起见,我的对象模型具有类似于以下内容的结构:
[JsonConverter(typeof(JsonVehicleConverter))]
abstract class Vehicle
{
public int Wheels { get; set; }
}
class Bike : Vehicle
{
}
class Car : Vehicle
{
public int Doors { get; set; }
}
查看上面的模型,我想我可以像这样反序列化我的文档:
string json = @"{
""type"": ""car"",
""wheels"": 4,
""doors"": 2
}";
Vehicle vehicle = JsonConvert.DeserializeObject<Vehicle>(json);
然后,我的自定义转换器将继续解析该值,然后确定要使用的实现:
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var jsonObject = JObject.ReadFrom(reader);
var type = jsonObject.Value<string>("type");
if (type == "bike")
{
return serializer.Deserialize<Bike>(jsonObject.CreateReader());
}
else if (type == "car")
{
return serializer.Deserialize<Car>(jsonObject.CreateReader());
}
}
但是,问题在于Bike
,它Car
继承了告诉串行器使用哪个转换器的属性。
这样做的结果是JSON.NET将永远卡在一个ReadJson
循环中,从而导致StackOverflowException
(适当的情况)。
所以问题是:如何以子类不继承的方式将属性应用于抽象类?
您是否尝试过将属性更改为不继承?
[System.AttributeUsage(System.AttributeTargets.All,
AllowMultiple = false,
Inherited = false)]
public JsonVehicleConverterAttribute : System.Attribute
{
...
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句