C# XMLSerializer:反序列化为派生类型

C# XMLSerializer:反序列化为派生类型,c#,serialization,xml-serialization,xml-deserialization,C#,Serialization,Xml Serialization,Xml Deserialization,我祈祷有人对Microsoft XmlSerializer有很好的了解 基本上,我已经构建了一个系统,用于在序列化程序的背面输出XML,这现在给我带来了很多麻烦,我正在尝试避免重大的重写 介绍 我当前的系统使用了很多派生类 比如说, 基本响应->停车场响应->停车场响应记录 BaseResponse和CarParkResponse(都在库dll中)与CarparkResponseInhered分开 因此,基类与派生类无关 我所做的 ->声明的派生类 我理解,为了让xmlserializer完成它

我祈祷有人对Microsoft XmlSerializer有很好的了解

基本上,我已经构建了一个系统,用于在序列化程序的背面输出XML,这现在给我带来了很多麻烦,我正在尝试避免重大的重写

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

比如说,

基本响应->停车场响应->停车场响应记录

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

因此,基类与派生类无关

我所做的 ->声明的派生类

我理解,为了让xmlserializer完成它的工作,有许多方法可以声明dervied类

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

  • 要在xmlSerialiser中序列化和反序列化的声明类型。例如:
XmlSerializer serializer=新的XmlSerializer(typeof(CarParkResponse),新类型[]{typeof(CarParkParameters),typeof(CarParkInformation)})

我跟后者去了

我想做什么 因为派生类是分离的,并且它们共享相同的属性,所以我尝试将dervied类序列化为子类

换句话说,将停车场响应反序列化为停车场响应

在“CarparkResponseInhered”中,我使用了声明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将生成一个带有“type”属性的carparkresponse元素

该值是“CarParkResponseInherited”。我已经编写了一些代码,从该值中删除“Inherited”,从而允许对其进行反序列化

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

所以 如果有人需要耐心阅读这篇文章,并能提供帮助或建议,我将不胜感激,因为我已经没有想法了


谢谢。

使用XmlAttributeOverrides类可以做一些事情。它主要用于特定的属性重写,因此它可能对您来说是最好的,也可能不是最好的

很长一段路要走,将其序列化为继承的类。然后,如果映射相同,则将xml反序列化为基类,然后重新序列化为所需的内容


根据您对程序集的控制程度,您可以重写继承类上的序列化,使其作为基类来执行。

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

很长一段路要走,将其序列化为继承的类。然后,如果映射相同,则将xml反序列化为基类,然后重新序列化为所需的内容


根据您对程序集的控制程度,您可以重写继承类上的序列化,使其作为基类来执行。

为响应喝彩,我在XmlAttributeOverrides方面遇到了麻烦,它使我更进一步,然后我在响应对象内的数据方面遇到了一些其他问题(其中一张是名单)。我暂时不得不避开XmlSerializer。我打算在有时间的时候重新讨论这个问题,并将其发布到这里。我大量使用继承,我认为正是这一点导致XmlSerializer出现了问题。为这一响应欢呼,我在XmlAttributeOverrides方面遇到了麻烦,这让我更进一步我的响应对象中的数据还存在一些其他问题(其中一个是列表)。我暂时不得不避开XmlSerializer。我打算在有时间的时候重新讨论这个问题,并将其发布到这里。我大量使用继承,我认为正是这一点导致XmlSerializer出现问题。