有什么理由不使用XmlSerializer?

Jim*_*iel 10 .net c# xml serialization

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

编辑:标准类我的意思是XmlDocument,XmlElement,XmlAttribute ...等.

Tho*_*que 11

使用时有很多限制XmlSerializer:

  • 你必须有一个公共无参数构造函数(如评论中的idlewire所述,它不必是公共的)
  • 仅序列化公共属性
  • 接口类型无法序列化
  • 还有其他几个......

这些约束通常会迫使您做出某些设计决策,而这些决策并非您在其他情况下所做的设计决策......而且一种迫使您做出错误设计决策的工具通常不是一件好事;)

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


Jon*_*eet 5

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

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

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

  • @Dmitry:我发现当我的类型是不可变的时,代码更容易推理,多线程更简单.对于XML序列化,我经常最终手动编写自己的ToXElement和FromXElement代码.这很难,你最终完全控制了所产生的东西. (2认同)

jri*_*sta 5

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

在某些情况下,使用XmlSerializer并不是最好的方法.以下是一些案例:

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