【发布时间】: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