2009-12-29 50 views
5

我一直在尋找在這一段時間,現在XML序列化 - 當要使用的DataContractSerializer /二進制/ XMLSerialiser

看來,二進制序列化是不鼓勵任何改變字段名稱打破系列化=?不好

的XMLSerializer是有問題的,因爲你必須提供一個無參數的構造函數和公共領域雖然你們的確有過的元素是屬性或元素及其命名

DataContractSerializer的是好的,但所有suclassses需要明確更多的控制添加這是一種恥辱

但是我偶然發現NetDataContractSerializer沒有這個限制。

如果你的目標是C#序列化,並且對xml的大小沒有大的限制,NetDataContractSerializer總是以這種方式去?

回答

10

Dan Rigsby在XmlSerializer vs. DataContractSerializer上有一篇非常不錯的比較文章,也涉及NetDataContractSerializer。

的DataContractSerializer:

  • 速度非常快 - 比XmlSerializer的速度在10%左右
  • 它的互操作性 - 與Java,Ruby的完美的作品 - 你的名字
  • 使用顯式 「選入」 模型 - 你需要馬克什麼得到序列化
  • 不需要任何構造函數
  • 可序列化非公共成員和內部字段
  • 不支持XML節點的屬性

你告訴DCS明確連載什麼,但你沒有超過如何多大影響完成。

XmlSerializer的

  • 連載僅公共字段和屬性
  • 連載一切,除了那些你排除(退出模型)
  • 支持的屬性和一切
  • 它的互操作性 - 與完美的作品Java,Ruby - 你的名字
  • 需要一個無參數的構造函數進行反序列化

你很清楚地告訴XmlSerializer如何和序列化什麼,但是你不能序列化所有東西 - 只有公開可見的屬性。 NetDataContractSerializer有點奇怪 - 它不可互操作,它只在兩端都是.NET的情況下才起作用 - 它在消息中包含了.NET類型信息(使其變大)。您不能將其以聲明方式添加到「開箱即用」的WCF服務中。

這是一個艱難的折衷 - 一如既往。肯定遠離任何二進制格式化程序 - 這不是向後兼容,脆弱和必然會讓你頭痛的 - 使用這些標準方法之一。對於你的情況,哪一個「最好」是真的很難說 - 你必須爲你自己找出一個......

+2

Xml串行器也非常具有互操作性。主要的缺點是對編程模型的限制或限制(最好有ctor,要序列化,數據必須公開等)。 ps:XML序列化程序除了屬性外,還會序列化public * fields *。 – Cheeso 2009-12-29 22:00:18

+0

@Cheeso:是的,謝謝 - 好點 – 2009-12-29 22:10:05

2

Marc Gravell在他的博客上顯示the results of a benchmark他用DataContractSerializer,XmlSerializer,和大多數其他.NET序列化程序,包括protobuf-net(他創建的Protocol Buffers for .NET實現)。

相關問題