假设我有两个类,一个基类和一个派生类。它们是相当简单的类,主要用作数据结构(派生类显然稍微复杂一些)。
public class BaseUserSession
{
// ... Various properties ...
}
public class DerivedUserSession : BaseUserSession
{
// ... Even more properties ...
}这些类需要序列化为XML。现在,只需在类声明的前面指定[Serializable]即可完成,默认的XML序列化程序可以很好地工作。
然而,在现实中,有多个从基类继承的类。我的目标是使基类能够使用任何派生类的序列化XML。
我尝试过两种方法,但目前这两种方法都没有效果。首先,使用本机XML序列化程序和基类中的一些控件属性。生成的XML如下所示:
<?xml version="1.0" encoding="utf-16"?>
<DerivedUserSession xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SSO="www.mywebsite.com">
<SSO:Id />
<SSO:Authenticated>false</SSO:Authenticated>
<SSO:Role />
<EmailAddress />
<FullName />
<Street />
<City />
<State />
<Zip />
<DayPhone />
<EveningPhone />
<ErrorMessage />
<Birthdate>0001-01-01T00:00:00</Birthdate>
<CurrentControl>0</CurrentControl>
</DerivedUserSession>以SSO为前缀的标记是从基类继承的标记。但是,当我试图将它反序列化为一个BaseUserSession对象时,它会抛出一个异常:System.InvalidOperationException: <DerivedUserSession xmlns=''> was not expected.
我还尝试创建基类IXmlSerializable,并手动读取和编写所有XML。但是,派生类不能写出它们的属性,我真的不想为每个类实现IXmlSerializable。
有更简单的方法吗?
=Edit=
我终于实现了一个相当丑陋的方法来完成这个任务。这两个类继承自基类,它们都实现了IXmlSerializable。每个类(包括基)写出其字段值(辛苦地.)使用反射进入自己的XML层次结构,并将这些值读取回来。编写的第一个值总是来自基类。
每个应用程序还包括将序列化管理为XML和back的代码,提供了一个简单的接口。会话本身现在除了简单地接受序列化的XML并将其存储在公共密钥下之外,什么也不做。进入和来自XML的序列化都由应用程序处理,并且在所有应用程序中都使用一个公共的XmlRootAttribute来绕过InvalidOperationException。
因此,现在,当另一个应用程序试图反序列化最初在不同应用程序中创建的XML时,它设法在遇到一个未被识别的元素之前读取公共基类值,此时它会在其他地方获取所需的值,这是可能的,因为它已经有了公共的基值。
我要读一下序列化原则..。
发布于 2011-05-18 21:36:02
XmlSerialization不是多态的(然而,成员属性与声明类一起使用;也就是说,除非您用new关键字(与override相反)替代一个成员,否则您将“继承”序列化属性。
反序列化总是导致序列化的实际类型。这很有道理,真的。
发布于 2011-05-18 21:33:56
好吧,我已经成功地完成了你想用DataContractSerializer做的事情。
您应该将KnownTypes属性放在要序列化的基类上,或者更好地使用DataContractResolver查找派生类型。
我在网络上看到了一个通用的实现,如果我再次找到它,我会在这里发布它。
编辑
找到它了这里
如果你需要更多的帮助,请告诉我。
https://stackoverflow.com/questions/6051228
复制相似问题