65.9K
CodeProject 正在变化。 阅读更多。
Home

一个 XML 可序列化基类

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.33/5 (3投票s)

2009年2月24日

MIT

3分钟阅读

viewsIcon

33012

downloadIcon

378

XmlObject 是当你需要高性能 XML 可序列化对象时,要派生的类。

引言

使用面向服务的架构编写应用程序变得越来越普遍。在某些情况下,我们甚至将我们的领域模型建立在 XML 基础上。因此,将需要 .NET 类来将此类 XML 结构表示为强类型对象。

背景

实现 XML 可序列化对象的***简单、***常见方法是通过声明式、基于反射的序列化。程序元素,例如类和属性,使用声明如何将此程序元素序列化为 XML 的属性进行装饰。然后使用 XmlSerializer 从 XML 生成对象,并将对象序列化为 XML。

另一种方法是实现 IXmlSerializable 接口,并使用 XmlReader 手动解析 XML。这比声明式序列化提供了更好的性能和更多的控制,但更难实现。

我编写了这个 XmlObject 类及其相关类,以帮助实现基于 IXmlSerializable 的序列化,并尽可能减少工作量。

何时使用

如果您需要从 XML 模式生成代码,也许您尝试过 xsd.exe,并且对结果不满意。如果您需要更多地控制序列化,或者性能对您很重要,那么您可以考虑自己生成代码。

XmlObject 类非常适合用作 XML 模式生成代码的基类,或者通常只是用来将某些 XML 结构表示为对象。

如果您使用 WCF,派生自 XmlObject 的类非常适合与服务契约一起使用。序列化/反序列化过程将无缝执行。

用法

如果您之前使用过 Simple API for XML (SAX),您知道这种方法比 XmlReader 更易于使用,尽管 XmlReader 效率更高。我已经尝试结合这些策略。

以下类是实现的一部分

XmlObject

此类实现 IXmlSerializable,用于快速 XML 读写。当您派生此类时,此类将“驱动” XML 解析过程,并且它将完全处理 XML 生成过程。您可以重写方法,例如 ReadAttributeReadElementReadText,以“监听”您感兴趣的特定内容。您通常使用强类型属性来表示对象中的特定属性。但是,这些属性不会使用后备字段,而是使用 AttributesElements 字典。

XmlNodeDictionary

这个类基本上只是一个 Dictionary<XmlQualififiedName, object>XmlObject 具有两种此类型的属性:AttributesElements。这些属性可分别用于访问属性和元素。

XmlCodeContentType<E>

枚举在 XML 和 XML 模式中非常常见。将它们扩展也很常见,这样您可以从预定义的集合中选择一个值,但您也可以指定任何未在此枚举中预定义的标准化的 string 值。例如,像这样

<xsd:union memberTypes="ObjectiveActionCodeEnumType xsd:normalizedString"/>

xsd.exe 将自动将该类型的属性转换为 string。但是,XmlCodeContentType 是一个用于表示这种强类型结构的类。

XmlEnum<E>

一个 static 实用程序类,在将 XML 代码列表解析为 CLR 枚举时会派上用场。

结论

如果您需要解决方案中高性能的 XML 可序列化对象,您可能想看一看。请随时向我提供反馈或提出问题。

随附的源代码包含一个简单的示例,但如果您想看到来自真实世界的东西,请告诉我。

历史

  • 2009 年 2 月 24 日 - 1.0.0.0
  • 2009 年 2 月 24 日 - 2.0.0.0
    • 修复文章不一致性/改进文章
© . All rights reserved.