DataContractSerializer与XmlSerializer:每个序列化程序的优点和缺点

Vit*_*nco 82 .net serialization

我的桌面应用程序使用序列化对象XmlSerializer.我被建议改为利用DataContractSerializer.
我应该在哪些场景下使用DataContractSerializer

非常感谢

评论.
1.输出XML文件存储在本地.没有其他应用程序反序列化该XML文件中的对象.
2.我的应用程序与.NET Framework 3.5 SP1一起运行.

mar*_*c_s 109

Dan Rigsby有这个最终的帖子 - 去读吧!

XmlSerializer与DataContractSerializer(网络存档)

他说,所有这些都是以一种非常有说服力的方式说的.

简而言之:

XmlSerializer的:

  • 已经存在了很长时间
  • 是"选择退出"; 公开的一切都被序列化了,除非你告诉它不要([XmlIgnore])

DataContractSerializer是:

  • 镇上的新孩子
  • 针对速度进行优化(通常比XmlSerializer快10%左右)
  • "选择加入" - 只有你特意标记为[DataMember]将被序列化的东西
  • 但任何标有的东西[DataMember]都会被序列化 - 无论是public或是private
  • 不支持XML属性(出于速度原因)

  • 关于DataContractSerializer的最大警告 - 反序列化时,它关心元素的顺序,如果它们的顺序不正确,则会无声地失败.Imho,除非你在两端使用完全相同的组件,这使得它非常危险. (14认同)
  • @Paul-SebastianManole:如果您的源XML包含XML元素的属性(例如`<Customer Id ="42"> ...`),那么您只能选择使用XML序列化程序 (6认同)
  • @Paul-SebastianManole:出于速度原因,DataContractSerializer不支持XML属性.有什么要详细说明的? (2认同)
  • 这可能是有用的,取自MSDN:_XmlSerializer类支持比DataContractSerializer类更窄的类型集,但允许更多地控制生成的XML并支持更多的XML Schema定义语言(XSD)标准.它也不需要可序列化类型的任何声明性属性...... XmlSerializer类不支持数据协定类型._ [MSDN](http://msdn.microsoft.com/en-us/library/ms733901.aspx) . (2认同)
  • 如果您习惯了 XmlSerializer 更宽松的性质,这仍然是相当意外的行为。在当今时代,用户可能会假设 &lt;xs:all&gt; 的行为更像 Json (2认同)
  • 我第二个@Pxtl,我正在使用不断变化的模式序列化到文件,其中对继承的基类进行重构 - 我不关心顺序,我不关心 Web 服务 - 我只希望我的类具有向后兼容性 -这对我来说是一个无声的搅局者,在投入制作之前我几乎没有意识到,我对此表示感谢。 (2认同)
  • 在 DataContractSerializer 被一些东西(主要是反序列化命令)烧毁之后,我建议远离它,除非你控制服务的两端并且你需要你的服务非常快。如果您只控制一端而您无法控制另一端正在做什么,那么安全的赌注是 XMLserializer 加上那些可以看到的 XML 属性,使您的服务文档变得更加容易。 (2认同)