首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IXmlSerializable与继承

IXmlSerializable与继承
EN

Stack Overflow用户
提问于 2011-05-18 21:28:10
回答 2查看 2K关注 0票数 4

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

代码语言:javascript
复制
public class BaseUserSession
{
    // ... Various properties ...
}

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

这些类需要序列化为XML。现在,只需在类声明的前面指定[Serializable]即可完成,默认的XML序列化程序可以很好地工作。

然而,在现实中,有多个从基类继承的类。我的目标是使基类能够使用任何派生类的序列化XML。

我尝试过两种方法,但目前这两种方法都没有效果。首先,使用本机XML序列化程序和基类中的一些控件属性。生成的XML如下所示:

代码语言:javascript
复制
<?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时,它设法在遇到一个未被识别的元素之前读取公共基类值,此时它会在其他地方获取所需的值,这是可能的,因为它已经有了公共的基值。

我要读一下序列化原则..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-18 21:36:02

XmlSerialization不是多态的(然而,成员属性与声明类一起使用;也就是说,除非您用new关键字(与override相反)替代一个成员,否则您将“继承”序列化属性。

反序列化总是导致序列化的实际类型。这很有道理,真的。

票数 2
EN

Stack Overflow用户

发布于 2011-05-18 21:33:56

好吧,我已经成功地完成了你想用DataContractSerializer做的事情。

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

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

编辑

找到它了这里

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6051228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档