XMLSerializer:反序列化为派生类型

时间:2011-11-11 15:41:47

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

我的手指交叉,有人对Microsoft XmlSerializer有很好的了解。

基本上,我已经在串行器的背面构建了一个输出XML的系统,这个系统现在给我带来了很多麻烦,我试图避免重大的重写。

简介

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

例如,

BaseResponse - > CarParkResponse - > CarParkResponseInherited

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

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

我做了什么

- >声明的派生类

我理解为了让xmlserializer能够做到这一点,有许多方法可以声明这些类。

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

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

XmlSerializer serializer = new XmlSerializer(typeof(CarParkResponse),new Type [] {typeof(CarParkParameters),typeof(CarParkInformation)});

  

我跟后者走了。

我想做什么

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

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

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

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

  
    

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

  

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

问题

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

  
    

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

  

令人沮丧的是,CarParkResponse就在那里。我想知道这是否属于我在类中使用XmlType(“响应”)的事实,并且序列化程序不会将该类识别为CarParkResponse的类型

所以我的问题是

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

我已经尝试过生成的xml。

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

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

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

所以...

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

感谢。

1 个答案:

答案 0 :(得分:0)

可以使用XmlAttributeOverrides类执行某些操作。它主要用于特定的属性覆盖,因此对您来说可能是也可能不是最佳选择。

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

根据对程序集的控制程度或控制程度,可以覆盖继承类的序列化,以便将其作为基类。