IXmlSerializable和inheritance

假设我有两个类,一个基类和一个派生类。 它们是相当简单的类,主要只是作为数据结构(派生类显然稍微复杂一些)。

public class BaseUserSession { // ... Various properties ... } public class DerivedUserSession : BaseUserSession { // ... Even more properties ... } 

这些类需要序列化为XML。 现在,这可以通过在类声明之上指定[Serializable]来完成,并且默认的XML序列化程序运行良好。

但实际上,有多个类从基类inheritance。 我的目标是能够使任何派生类的序列化XML可由基类使用。

我尝试了两种方法,目前都没有。 首先,使用本机XML序列化程序和基类中的一些控制属性。 生成的XML看起来像这样:

    false           0001-01-01T00:00:00 0  

带有SSO前缀的标记是从基类inheritance的标记。 但是,当我尝试将其反序列化为BaseUserSession对象时,它会抛出exception: System.InvalidOperationException: was not expected.

我还尝试制作基类IXmlSerializable ,并手动读取和写入所有XML。 但是,派生类无法写出它们的属性,我真的不想为每个类实现IXmlSerializable

有更简单的方法吗?

= =编辑

我终于实现了一个相当丑陋的方法来实现这一目标。 这两个类inheritance自base,它们都实现了IXmlSerializable 。 每个类(包括基类)使用reflection将其字段值(辛苦地……)写入其自己的XML层次结构中,并将这些值读回。 写入的第一个值始终来自基类。

每个应用程序还包括管理序列化为XML并返回的代码,提供简单的界面。 会话本身现在不再做任何事情,只是接受序列化的XML并将其存储在公共密钥下。 XmlRootAttribute XML的序列化全部由应用程序处理,并且在所有应用程序中使用通用的XmlRootAttribute来绕过InvalidOperationException

所以现在,当另一个应用程序尝试反序列化最初在不同应用程序中创建的XML时,它会设法在它到达无法识别的元素之前读取公共基类值,此时它会在其他位置读取所需的值,这是可能因为它已经具有公共基值。

我需要阅读序列化原则……

XmlSerialization不是多态的(成员属性,但是,与声明类一起使用;即除非用new关键字否决成员(与override相反),否则你将’inheritance’序列化属性。

反序列化始终会导致序列化的实际类型。 这真的很有道理。

好吧,我已经设法使用DataContractSerializer做你想做的事情。

您应该将KnownTypes属性放在要序列化的基类上,或者更好的是,使用DataContractResolver查找派生类型。

我在网上看过一个通用的实现,如果我再找到它,我会在这里发布。

编辑

在这里找到它

如果您需要更多帮助,请告诉我。