XMLSerializer:作为派生类型反序列化



我希望有人对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反序列化到基类中,然后重新序列化为所需的内容。

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

最新更新