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


84

我的桌面应用程序使用序列化对象XmlSerializer。建议我DataContractSerializer改用杠杆作用。
我应该在哪种情况下使用DataContractSerializer

非常感谢

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


Answers:


112

丹·里格斯比(Dan Rigsby)在这方面拥有最终的文章-请阅读!

XmlSerializer与DataContractSerializer(网络档案)

他说了所有的话,而且很有说服力。

简而言之:

XmlSerializer:

  • 已经存在很长时间了
  • 是“选择退出”;公开的所有内容都会序列化,除非您不告诉它([XmlIgnore])

DataContractSerializer为:

  • 镇上的新孩子
  • 针对速度进行了优化(通常比XmlSerializer快10%)
  • “选择加入”-只有您明确标记为的内容[DataMember]才会被序列化
  • 但任何标记[DataMember]将被序列化-无论是publicprivate
  • 不支持XML属性(出于速度原因)

2
@ Paul-SebastianManole:出于速度原因,DataContractSerializer不支持XML属性。要详细说明什么?
marc_s 2013年

6
@ Paul-SebastianManole:如果您的源XML包含XML元素上的属性(如<Customer Id="42"> ...),那么您唯一的选择是使用XML序列化程序
marc_s 2013年

2
这可能有用,取自MSDN:XmlSerializer类所支持的类型集比DataContractSerializer类要窄得多,但允许对结果XML进行更多控制,并支持更多XML Schema定义语言(XSD)标准。它还不需要可序列化类型的任何声明性属性。XmlSerializer类不支持数据协定类型。 MSDN
Paul-Sebastian Manole 2013年

1
@OO:不仅选择加入,在.NET 3.5 SP1和更高版本中-但对我来说,它仍然是首选的处理方式。允许您设置原本无法设置的属性(如序列化顺序,名称空间等等)
marc_s 2013年

17
关于DataContractSerializer的最大警告-反序列化时,它关心元素的顺序,如果元素的顺序不正确,则会静默失败。恕我直言,除非您在两端使用完全相同的程序集,否则这将导致不必要的危险。
Pxtl
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.