【问题标题】:XMLSerializer: Deserializing as derived typeXMLSerializer:反序列化为派生类型
【发布时间】:2011-11-11 15:41:47
【问题描述】:

我很高兴有人对 Microsoft XmlSerializer 有很好的了解。

基本上,我已经在序列化程序的背面构建了一个用于输出 XML 的系统,这给我带来了很多麻烦,我试图避免大量的重写。

简介

我当前的系统使用了很多派生类。

例如,

BaseResponse -> CarParkResponse -> CarParkResponseInherited

BaseResponse 和 CarParkResponse(都在库 dll 中)与 CarParkResponseInherited 分开。

因此,基类忽略了派生类。

我做了什么

-> 声明派生类

我很欣赏为了让 xmlserializer 完成它的工作,有多种方法可以声明派生类。

  • 使用 XmlInclude 在基类中声明派生类

或

  • 在 xmlSerialiser 中声明要序列化和反序列化的类型。例如:

XmlSerializer 序列化器 = new XmlSerializer(typeof(CarParkResponse), new Type[] { typeof(CarParkParameters), typeof(CarParkInformation) });

我选择了后者。

我想做什么

因为派生类是独立的并且它们共享相同的属性,所以我要做的是将派生类序列化为子类。

换句话说,将 CarParkResponseInherited 反序列化为 CarParkResponse。

在“CarParkResponseInherited”中,我使用声明 XmlTypeAttribute("CarParkResponse")。

最初这会导致序列化时出现问题

类型“CarParkResponseInherited”和“CarParkResponse”都使用来自命名空间“”的 XML 类型名称“CarParkResponse”。使用 XML 属性为类型指定唯一的 XML 名称和/或命名空间。"

因为该类型已经在使用“CarParkResponse”,所以我在“CarParkResponse”中声明了 XmlType("Response") 来解决这个问题。

问题

我现在正在尝试反序列化返回的 XML,但我现在遇到了以下问题。

无法识别指定的类型:name='CarParkResponse', namespace='', at OriginalRequest xmlns=''

令人沮丧的是,CarParkResponse 在那里。我想知道这是否是因为我在类中使用了 XmlType("Response") 并且序列化程序没有将类识别为 CarParkResponse 的类型

所以我的问题是

基本上是否可以将派生类作为子类传递并使用 XmlSerializer 将其反序列化为子类?

我已经对生成的 xml 进行了实验。

例如,如果我不在代码中的任何位置使用序列化标记(例如 XmlType() 等)。生成的 xml 将生成一个带有“类型”作为属性的 carparkresponse 元素。

值为“CarParkResponseInherited”。我编写了一些代码,从允许反序列化的值中删除“继承”。

这种方法显然不好,所以我希望有一个好的方法。

所以...

如果有人不得不耐心阅读这篇文章并可以提供帮助或提供建议,那将不胜感激,因为我完全没有想法。

谢谢。

【问题讨论】:

    标签: c# serialization xml-serialization xml-deserialization


    【解决方案1】:

    使用 XmlAttributeOverrides 类可能会做一些事情。它主要用于特定的属性覆盖,因此它可能对您来说是最好的,也可能不是。

    很长的路要走,将其序列化为继承的类。然后,如果映射相同,则将 xml 反序列化为基类,然后重新序列化为您想要的。

    根据您对程序集的控制程度,您可以覆盖继承类上的序列化,使其作为基类进行。

    【讨论】:

    • 为那个响应干杯,我对 XmlAttributeOverrides 搞得一团糟,它让我更进一步,然后我在响应对象中的数据遇到了一些其他问题(其中一个是列表)。我不得不暂时避开 XmlSerializer。我打算在有时间的时候重新审视这个问题并将其发布在这里。我大量使用继承,我认为正是这导致了 XmlSerializer 出现问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 2017-03-22
    • 2012-05-25
    相关资源
    最近更新 更多