c# - IXmlSerializable 和继承

标签 c# xml serialization

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

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/

相关文章:

c# - 如何动态列出和访问 TabPage 对象

c# - 将匿名对象转换为表达式委托(delegate)

java - android 应用程序/Activity 生命周期 : when should we save to flash?

.net - 如何控制复杂对象的反序列化

c# - HttpStatusCode.NotFoundfrom 服务器与 ssl

c# - 为什么这不能处理所有情况?

JAVA - 从XML解析特定数据

java - 使用 xpath 更新 xml 文档

java - 如何读取 .7z 扩展文件中的文件内容

c# - 自定义 JsonConverter WriteJson 不会改变子属性的序列化