一个 XML 可序列化基类
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 生成过程。您可以重写方法,例如 ReadAttribute
、ReadElement
或 ReadText
,以“监听”您感兴趣的特定内容。您通常使用强类型属性来表示对象中的特定属性。但是,这些属性不会使用后备字段,而是使用 Attributes
和 Elements
字典。
XmlNodeDictionary
这个类基本上只是一个 Dictionary<XmlQualififiedName, object>
。XmlObject
具有两种此类型的属性:Attributes
和 Elements
。这些属性可分别用于访问属性和元素。
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
- 修复文章不一致性/改进文章