有什么理由不使用XmlSerializer?

时间:2010-07-13 16:28:38

标签: c# .net xml serialization

我刚刚了解了.Net中的XmlSerializer类。在我总是使用标准类解析和编写XML之前。在我深入研究之前,我想知道是否有任何不适合的选择。

编辑:标准类我指的是XmlDocument,XmlElement,XmlAttribute ......等。

8 个答案:

答案 0 :(得分:11)

使用XmlSerializer时有许多限制:

  • 您必须拥有 public 无参数构造函数(如评论中的idlewire所述,它不必公开)
  • 仅序列化公共属性
  • 无法序列化接口类型
  • 和其他一些......

这些约束通常会迫使你做出某些设计决策,这些设计决定不是你在其他情况下所做的那些......而且一个迫使你做出糟糕设计决定的工具通常不是一件好事;)

话虽这么说,当你需要一种快速的方式来存储XML格式的简单对象时,它会非常方便。我也喜欢你对生成的模式有很好的控制权。

答案 1 :(得分:5)

嗯,显然,它并没有给你足够的控制输出。就我个人而言,我发现LINQ to XML使得手动编写它非常容易,我很乐意这样做,至少对于相当小的项目。如果您使用的是.NET 3.5或4但不使用LINQ to XML,请立即查看它 - 它比旧的DOM更好

有时能够控制序列化和反序列化是很好的...尤其是当您更改数据的布局时。如果你不是在那种情况下并且没有预料到它,那么内置的XML序列化可能会没问题。

编辑:我不认为 XML序列化支持构建真正的不可变类型,而这显然可以通过手工构建来实现。由于我是不变性的粉丝,这绝对是我所关注的事情。如果您实施IXmlSerializable我相信您可以使用公共不变性,但您仍然必须是私人可变的。当然,我可能错了 - 但值得检查。

答案 2 :(得分:5)

如果您经常对相同类型进行序列化和反序列化,并且需要这些类型的序列化表示可供不同平台(即Java,Javascript等)使用,那么XmlSerializer可以为您省去很多麻烦。建议尽可能使用XmlSerializer,因为它可以减轻相当大的麻烦,试图自己管理从对象图到XML的转换。

在某些情况下,使用XmlSerializer并非最佳方法。以下是一些案例:

  • 当您需要快速,仅向前处理大量xml数据时
    • 使用XmlReader
  • 当您需要使用XPath在xml文档中执行重复搜索时
  • 当xml文档结构相当随意,并且不经常符合已知对象模型时
  • 当XmlSerializer强加的要求不符合您的设计要求时:
    • 如果您没有默认的公共构造函数,请不要使用它
    • 您不能使用xml序列化程序属性来定义元素和属性名称的xml变体以符合必要的Xml架构

答案 3 :(得分:4)

我发现XmlSerializer的主要缺点是:

1)对于涉及集合的复杂对象图,有时很难通过使用序列化控制属性来获得所需的XML模式。

2)如果您更改应用程序的一个版本与下一个版本之间的类定义,则您的文件将变得不可读。

答案 4 :(得分:2)

是的,我个人使用自动XML序列化 - 虽然我最初使用的DataContractSerializer因为WCF而引入(能够序列化没有属性的类型非常有帮助)因为它没有嵌入类型。当然,您需要知道在重新加载时要反序列化的对象类型。

最大的问题是,如果没有在可能要编写其数据类型的类型上实现IXmlSerializable,或者暴露序列化程序可以本机处理的其他类型,则很难序列化为属性。

我想最大的问题是你无法自动序列化接口,因为DCS希望能够在收到XML时再次构造实例。但是,本机支持标准集合接口。

总而言之,我发现DCS路线是最快,最无痛的方式。

作为替代方案,您还可以调查使用Linq to XML来读取和编写XML(如果您想要完全控制) - 但是您仍然必须逐个成员地处理类型。

我最近一直在关注这个问题(因为我无法看到这一点,因为我无法看到这一点),因为他已经阅读了Jon Skeet新书的早期访问权。不得不说 - 我对使用XML很容易让我印象深刻。

答案 5 :(得分:1)

我过去经常使用XmlSerializer,可能会继续使用它。然而,最大的陷阱是上面已经提到的:

对序列化程序的约束(例如对公共成员的限制)要么1)对与其主要功能无关的类施加设计约束,要么2)强制增加处理这些约束的复杂性。 / p>

当然,其他Xml序列化方法也会增加复杂性。

所以我想我的答案是,没有适合所有情况的正确或错误答案;选择序列化方法只是其中许多设计考虑因素之一。

答案 6 :(得分:0)

Thera有些情况。

  • 您必须处理大量XML数据 - 序列化程序可能会覆盖您的内存。我曾经有过一次包含2000左右表的数据库转储的简单模式。只有一小部分类,但最终序列化不起作用 - 我不得不使用SAX流解析器。

除此之外 - 在正常情况下我没有看到任何情况。处理XML Serializer比使用更低级别的解析器更容易,特别是对于更复杂的数据。

答案 7 :(得分:-1)

当您想要传输大量数据时,您的资源非常有限。