46

先週のシリアライズにはかなりの時間を費やしました。その間、私はBinaryFormatterまたはXmlSerializerのいずれかを利用する多くの例を見つけました。残念ながら、私が見つけなかったのは、2つの違いを包括的に詳述した例でした。XmlSerializerとBinaryFormatterの違いは何ですか

私の好奇心の起源は、BinaryFormatterがXmlSerializerがインターフェイスに直接的に逆シリアル化できる理由にあります。 「casting to multiple (unknown types) at runtime」に対する回答のJon Skeetは、インターフェイスへの直接バイナリシリアル化の例を提供します。 Stan R.は、 "XML Object Deserialization to Interface"への回答でXmlSerializerを使用して私の目標を達成する手段を私に提供しました。

BinaryFormatterの明白な部分を除き、XmlSerializerはXMLを使用していますが、基本的な違いをより完全に理解したいと思います。いつどちらか一方とそれぞれの長所と短所を使用する。

答えて

87

オブジェクトのタイプおよびアセンブリ情報を含むバイナリストリームメタデータに元々シリアル化されるときにオブジェクトデータで貼り付けられているので、バイナリフォーマッタは、インタフェースタイプに直接デシリアライズすることができる理由です。これは、バイナリフォーマッタがオブジェクトを逆シリアル化してその型を知っていれば、正しいオブジェクトを構築し、それをオブジェクトが実装するインタフェース型にキャストできることを意味します。

XMLシリアライザは、スキーマにシリアル化し、オブジェクトのパブリックフィールドと値のみをシリアル化し、それ以外のタイプ情報は一切シリアル化しません(タイプ実装のインタフェースなど)。

BinaryFormatter,SoapFormatter、およびを比較すると、ここには良い投稿、.NET Serializationがあります。上記のシリアライザに加えて、DataContractSerializer,NetDataContractSerializerおよびprotobuf-netが含まれている次の表を参照することをお勧めします。

Serialization Comparison

+1

テーブルが良好です。私はジェネリック医薬品の不足がSOAPを迷惑に感じていました。 –

+1

@ahsteele - あなたは星です –

+5

"最高のパフォーマンス"の分類は間違っていると思います。バイナリフォーマッタは、.netでもっとも性能の低いシリアライザです(ソープフォーマッタを除く)。少なくともそれはほとんどのベンチマークが示すものです:http://blogs.msdn.com/b/youssefm/archive/2009/07/10/comparing-the-performance-of-net-serializers.aspx、http:// james。 newtonking.com/archive/2010/01/01/net-serialization-performance-comparison.aspx、http://techmikael.blogspot.com/2010/01/net-serialization-performance.html – joniba

1

XmlSerializerは、パブリックゲッターとパブリックセッター(およびパブリックフィールド)の両方を持つすべての型のプロパティを読み取ることによって、型をシリアル化します。この意味で、XmlSerializerは、インスタンスの「パブリックビュー」をシリアル化/逆シリアル化します。

これに対して、バイナリフォーマッタは、インスタンスの「内部」すなわちフィールドをシリアル化して型をシリアル化します。 [NonSerialized]としてマークされていないフィールドは、バイナリストリームにシリアル化されます。型自体には、直列化される内部フィールドも必要であるため、[Serializable]としてマークする必要があります。

2

XMLシリアライザはXMLとXMLスキーマ(暗黙的に)を生成します。このスキーマに準拠したXMLが生成されます。

XMLスキーマで記述できないものは、シリアル化しないことを意味します。たとえば、リストとXMLスキーマの配列を区別する方法がないため、シリアライザによって生成されたXMLスキーマはいずれの方法でも解釈できます。

ランタイムシリアライズ(BinaryFormatterの一部)は、実際の.NETタイプを反対側にシリアル化します。したがって、List<int>を送信すると、もう一方の側はList<int>になります。

もう一方の側が.NETを実行している場合は、明らかに優れています。

+0

こんにちはJohn、私はちょうどリストを扱うかどうか疑問に思っていたは、まだBinaryFormatterを好むでしょうか? – paradisonoir

+0

No.リストはほんの一例にすぎません。 2つのケースでは全く異なるユースケースがあります。ところで、SoapFormatterを見てください。ランタイムシリアル化(2つのフォーマッタ)は、XMLシリアル化とは全く異なります。これは、データコントラクトのシリアル化とはまったく異なります。 –

0

私は最も重要なものの1つは、バイナリシリアル化がパブリックメンバーとプライベートメンバーの両方をシリアル化できるということです。

ここでは、サイズの点でこれらの2つを非常に参考にして比較しています。シリアライズされたオブジェクトをリモートマシンに送信する可能性があるため、非常に重要な問題です。

http://www.nablasoft.com/alkampfer/index.php/2008/10/31/binary-versus-xml-serialization-size/

6
2の間に明らかな違いは、「XML対バイナリ」である

だけで重量を量るために...、それはより多くの深い行くん:

  • フィールドを( = bf)対公開メンバー(通常はプロパティ)(XmlSerializer = xs)
  • タイプメタデータベース(bf)vs contract-ba SEDバージョントレラントVS(XS)
  • バージョン脆性(BF)(XS)
  • ポータブル(XS)対 "グラフ" "木" 対(BF)(XS)
  • NETの特定(BF)
  • BinaryFormatterは脆いことができる理由の説明として
  • 人間可読(XS)対不透明(BF)

see here

どれが大きいのかを議論することは不可能です。 BinaryFormatterのすべてのタイプのメタデータはそれを大きくすることができます。 XmlSerializerは、gzipのような圧縮で非常にうまく動作します。

ただし、それぞれの強みを取ることができます。例えば、Googleは独自のデータシリアライズフォーマット「プロトコルバッファ」をオープンソース化しています。これは、次のとおりです。

ポータブル
  • 契約ベース
  • バージョントレラント
  • ツリーベース
  • 不透明(list of implementationsを参照してください)(.protoと組み合わせたときにデータを表示するためのツールがありますが、 )
  • 通常、「contract first」ですが、一部の実装では、リフレクションに基づく暗黙の契約が可能です。

重要なのは、タイプメタデータ、純粋なバイナリ表現、短いタグ、バリエーション長のベース7エンコーディングなどの非常に高密度のデータであり、処理するのに非常に効率的です(複雑なXML構造はなく、メンバーなど)。

少し偏っているかもしれません。私は実装の1つ(C#/ .NETに適したいくつかのものを含む)を維持していますが、 にはにリンクされていません。具体的な実装はです。フォーマットはそれ自身のメリットの下にあります; -p

関連する問題