假设我有两个类,一个基类和一个派生类。它们是相当简单的类,主要充当数据结构(派生类显然稍微复杂一些)。
public class BaseUserSession
{
// ... Various properties ...
}
public class DerivedUserSession : BaseUserSession
{
// ... Even more properties ...
}
这些类需要序列化为 XML。现在,这可以简单地通过指定 [Serializable]
来完成。在类声明之上,默认的 XML 序列化程序运行良好。
然而,实际上,有多个类继承自基类。我的目标是能够让任何派生类的序列化 XML 可供基类使用。
我尝试了两种方法,目前都不起作用。首先,在基类中使用 native 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
对于每个类(class)。
有更简单的方法吗?
=编辑=
我终于实现了一个相当丑陋的方法来完成这个。两个类继承自base,都实现了IXmlSerializable
.每个类(包括基类)都使用反射将其字段值(煞费苦心地……)写到自己的 XML 层次结构中,并读回这些值。写入的第一个值总是来自基类。
每个应用程序还包括管理序列化到 XML 和返回序列化的代码,提供一个简单的界面。 session 本身现在除了简单地接受序列化的 XML 并将其存储在一个公共(public) key 下之外什么都不做。进出 XML 的序列化全部由应用程序处理,并且一个公共(public)的 XmlRootAttribute
在所有应用程序中用于绕过 InvalidOperationException
.
所以现在,当另一个应用程序试图反序列化最初在另一个应用程序中创建的 XML 时,它设法在遇到无法识别的元素之前读取公共(public)基类值,此时它会去别处获取所需的值,这是可能的,因为它已经具有共同的基值。
我需要阅读序列化原则...
最佳答案
XmlSerialization 不是多态的(但是,成员属性与声明类一起使用;也就是说,除非您使用 new
关键字否决成员(与 override
相反)您将“继承”序列化属性。
反序列化总是产生被序列化的实际类型。这很有道理,真的。
关于c# - IXmlSerializable 和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6051228/