gpt4 book ai didi

c# - IXmlSerializable 和继承

转载 作者:数据小太阳 更新时间:2023-10-29 02:32:11 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com