我希望有人对Microsoft XmlSerializer有很好的理解。
基本上,我已经构建了一个在序列化器后面输出XML的系统,这个系统现在给我带来了很多麻烦,我试图避免大量的重写。
介绍我当前的系统使用了很多派生类。
例如,baserresponse -> CarParkResponse -> CarParkResponseInherited
baserresponse和CarParkResponse(都在库dll中)与CarParkResponseInherited是分开的。
因此,基类忽略了派生类。
我做了什么
->声明的派生类
我理解为了让xmlserializer完成它的工作,有许多方法可以声明派生类。
- 使用XmlInclude在基类中声明派生类
或
- 在xmlSerialiser中要序列化和反序列化的声明类型。例如:
XmlSerializer serializer = 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元素,其属性为"type"。
取值为CarParkResponseInherited。我写了一些代码,从允许反序列化的值中删除了"Inherited"。
这种方法显然不是很好,所以我希望有一个好的方法来解决这个问题。
所以…
如果有人有耐心读完这篇文章,可以帮助或提供建议,那将是最感激的,因为我已经没有主意了。
谢谢。
也许可以使用XmlAttributeOverrides类做一些事情。它主要用于特定的属性重写,所以它可能是也可能不是最适合您的。
较长的方法是继续将其作为继承类进行序列化。然后,如果映射相同,将xml反序列化到基类中,然后重新序列化为所需的内容。根据您对程序集的控制程度,您可以覆盖继承类的序列化,使其作为基类。