在进行数据序列化时,开发者通常会面临多种选择。本文将探讨三种常见的序列化技术:XmlSerializer、XAML序列化以及WCF中的DataContractSerializer。将从几个关键点进行对比分析,包括序列化的限制、XML输出的简洁性、对版本控制的支持等。
序列化过程中,开发者经常需要对序列化行为进行定制。然而,所有序列化器都使用CLR属性来改变其行为,这限制了对无法修改的类的序列化定制。此外,如果需要在不同情况下以不同方式序列化同一个类,这会变得困难。
XmlSerializer不支持字典。任何实现IDictionary的类型都被明确排除在外。这在一定程度上是由于时间限制,也因为哈希表在XSD类型系统中没有对应的类型。尽管如此,它能够愉快地序列化泛型列表。此外,还有一些可序列化的字典版本,也可以通过实现IXmlSerializable接口来自定义序列化困难的部分。
XAML序列化器生成相对简洁的XML,通过将基本属性放在属性中来实现。它也能很好地处理WPF属性,如颜色。不幸的是,XAML序列化器对泛型非常挑剔,尤其是列表和字典。它们可能偶尔可以工作,但表现非常不稳定。与其他序列化器不同,不能通过实现自定义序列化策略来绕过它——据所知,XAML没有IXmlSerializable的等价物。此外,默认情况下,XAML序列化器会包含所有null属性,如果类有很多null值,XML将会很大。
WCF序列化器可以序列化字典和列表。它是唯一一个可以在特殊模式下保留引用(同一个对象被引用两次)并处理循环依赖的序列化器。
默认情况下,XML序列化器会产生冗长的输出:每一件事都是一个元素。虽然可以通过应用大量的属性来使其变得非常美观,但这可能需要大量的工作。
XAML序列化器不允许对输出进行太多控制。它有很多命名空间声明,并且可能会被null值所污染。
WCF序列化器也不提供太多控制,一切都是以元素的形式存在。如果在“保留对象引用”模式下工作,那么每个元素都会有一个“id”属性。
XML序列化器不会将代码与类名绑定,所以通过一些调整,可以实现相当程度的向后兼容性。也可以使用一个类进行序列化,然后用另一个类进行反序列化。
XAML序列化器是最糟糕的——它将输出紧密地与类、程序集名称甚至属性名称耦合在一起,这使得版本控制变得困难。如果反序列化时某个特定属性不可用,它也会失败。能想到的唯一可行的选项是在反序列化之前添加XSLT。
据说WCF序列化器有一些内置的版本控制考虑,但需要研究它们是什么。