如何将属性应用于继承树中的单个类型?

史蒂文·里肯斯

这个问题主要针对我的特定问题,但是我觉得这里有一个更大的问题需要解决。

我正在尝试使用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将单个函数应用于对象列表中属性的不同组合?

来自分类Dev

如何将$(this)应用于单个子元素

来自分类Dev

如何将jQuery动画应用于单个项目?

来自分类Dev

如何将属性应用于HOVER上的3种输入类型?

来自分类Dev

如何将Box Shadow应用于Bootstrap Carousel中的单个图像

来自分类Dev

R编程如何将列表中的单个元素应用于函数

来自分类Dev

R编程如何将列表中的单个元素应用于函数

来自分类Dev

如何将Box Shadow应用于Bootstrap Carousel中的单个图像

来自分类Dev

如何将单个主题应用于 drupal 7 中的所有网络表单

来自分类Dev

如何将休眠验证应用于字符类型?

来自分类Dev

如何将NUnit属性应用于部件

来自分类Dev

如何将CSS应用于html属性

来自分类Dev

如何将css应用于标签的属性?

来自分类Dev

在Scala中,如何将隐式转换应用于集合的子类型?

来自分类Dev

在vim中,如何将针对文件类型的自动命令应用于文件的区域?

来自分类Dev

如何将条件属性应用于模板中的HTML元素?

来自分类Dev

如何将样式应用于QML中的TextField?似乎“样式”属性不可用

来自分类Dev

如何将函数应用于熊猫中每一行的对象属性

来自分类Dev

如何将条件属性应用于模板中的HTML元素?

来自分类Dev

如何将填充属性值应用于文档服务中的整个表?

来自分类Dev

如何将statsmodels中的OLS应用于groupby

来自分类Dev

如何将动画应用于列表中的项目

来自分类Dev

如何将 HeaderTemplateProperty 应用于 CustomControl 中的 HeaderProperty?

来自分类Dev

如何将主题应用于从文本框继承的Custome控件

来自分类Dev

当属性类型包括泛型类型时,如何将泛型JsonConverter应用于泛型类的属性?

来自分类Dev

如何将两种不同样式应用于单个Android控件?

来自分类Dev

如何将CSS样式表应用于单个特定元素?

来自分类Dev

如何将Room TypeConverter应用于实体的单个字段?

来自分类Dev

如何将功能应用于单个选项卡

Related 相关文章

  1. 1

    如何将单个函数应用于对象列表中属性的不同组合?

  2. 2

    如何将$(this)应用于单个子元素

  3. 3

    如何将jQuery动画应用于单个项目?

  4. 4

    如何将属性应用于HOVER上的3种输入类型?

  5. 5

    如何将Box Shadow应用于Bootstrap Carousel中的单个图像

  6. 6

    R编程如何将列表中的单个元素应用于函数

  7. 7

    R编程如何将列表中的单个元素应用于函数

  8. 8

    如何将Box Shadow应用于Bootstrap Carousel中的单个图像

  9. 9

    如何将单个主题应用于 drupal 7 中的所有网络表单

  10. 10

    如何将休眠验证应用于字符类型?

  11. 11

    如何将NUnit属性应用于部件

  12. 12

    如何将CSS应用于html属性

  13. 13

    如何将css应用于标签的属性?

  14. 14

    在Scala中,如何将隐式转换应用于集合的子类型?

  15. 15

    在vim中,如何将针对文件类型的自动命令应用于文件的区域?

  16. 16

    如何将条件属性应用于模板中的HTML元素?

  17. 17

    如何将样式应用于QML中的TextField?似乎“样式”属性不可用

  18. 18

    如何将函数应用于熊猫中每一行的对象属性

  19. 19

    如何将条件属性应用于模板中的HTML元素?

  20. 20

    如何将填充属性值应用于文档服务中的整个表?

  21. 21

    如何将statsmodels中的OLS应用于groupby

  22. 22

    如何将动画应用于列表中的项目

  23. 23

    如何将 HeaderTemplateProperty 应用于 CustomControl 中的 HeaderProperty?

  24. 24

    如何将主题应用于从文本框继承的Custome控件

  25. 25

    当属性类型包括泛型类型时,如何将泛型JsonConverter应用于泛型类的属性?

  26. 26

    如何将两种不同样式应用于单个Android控件?

  27. 27

    如何将CSS样式表应用于单个特定元素?

  28. 28

    如何将Room TypeConverter应用于实体的单个字段?

  29. 29

    如何将功能应用于单个选项卡

热门标签

归档