DataContractSerializerとXmlSerializer:各シリアライザーの長所と短所


84

デスクトップアプリケーションは、を使用してオブジェクトをシリアル化しますXmlSerializerDataContractSerializer代わりに活用するように提案されました。
どのシナリオで使用する必要がありますDataContractSerializerか?

どうもありがとう

コメント。
1.出力XMLファイルはローカルに保存されます。他のアプリケーションは、そのXMLファイルからオブジェクトを逆シリアル化しません。
2.私のアプリケーションは.NETFramework 3.5SP1で実行されます。


回答:


112

ダンリグスビーはこれに関する究極の投稿を持っています-それを読んでください!

XmlSerializerとDataContractSerializer(Webアーカイブ)

彼は言うべきことがすべて、そして非常に説得力のある方法で言っています。

要するに:

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
シリアライザー

2
これは、MSDNから引用した便利な方法です。XmlSerializerクラスは、DataContractSerializerクラスよりもはるかに狭いタイプのセットをサポートしますが、結果のXMLをより詳細に制御でき、XMLスキーマ定義言語(XSD)標準をはるかに多くサポートします。また、シリアライズ可能な型に宣言型属性は必要ありません... XmlSerializerクラスはデータコントラクト型をサポートしていません。 MSDN
Paul-Sebastian Manole 2013年

1
@OO:.NET 3.5 SP1以降ではオプトインするだけでなく、私にとっては、それが今でも好ましい方法です。他の方法では設定できないプロパティを設定できます(シリアル化の順序、名前空間など)
marc_s 2013年

17
DataContractSerializerに関する最大の警告-逆シリアル化する場合、要素の順序を考慮し、要素が正しい順序でない場合はサイレントに失敗します。イムホ、両端でまったく同じアセンブリを使用していない限り、これは非常に危険です。
pxtl 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.