我的手指交叉,有人对Microsoft XmlSerializer有很好的了解。
基本上,我已经在串行器的背面构建了一个输出XML的系统,这个系统现在给我带来了很多麻烦,我试图避免重大的重写。
我当前的系统使用了很多派生类。
例如,
BaseResponse - > CarParkResponse - > CarParkResponseInherited
BaseResponse和CarParkResponse(都在库dll中)与CarParkResponseInherited分开。
因此,基类忽略了派生类。
- >声明的派生类
我理解为了让xmlserializer能够做到这一点,有许多方法可以声明这些类。
或
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”。我写了一些代码,从允许反序列化的值中删除“继承”。
这种方法显然不是很好,所以我希望有一个很好的解决方法。
如果有任何人不得不耐心阅读这篇文章,可以提供帮助或提供建议,我将非常感激,因为我完全没有想法。
感谢。
答案 0 :(得分:0)
可以使用XmlAttributeOverrides类执行某些操作。它主要用于特定的属性覆盖,因此对您来说可能是也可能不是最佳选择。
很长的路要走,继续序列化为继承的类。然后,如果映射相同,则将xml反序列化到基类中,然后重新序列化为您想要的内容。
根据对程序集的控制程度或控制程度,可以覆盖继承类的序列化,以便将其作为基类。