とどう違うのは、XmlSerializerとBinaryFormatter
-
18-09-2019 - |
質問
私は良い部分です。作直列化します。当時から多くの事例のいずれかを利用したBinaryFormatterはXmlSerializer.残念ながら私を見つけられませんでしたした例を総合的にディティの違いる。
なうことになりました。私の好奇心にあるのBinaryFormatterが直列化復元に直接インターフェースをXmlSerializerいません。 Jon Skeet に答える"鋳物は複数の未知型)実行時に"を例に、直接バイナリーの直列化は、インターフェース。 スタンR. しっかり行ってくれたことの達成目標を使用XmlSerializer彼の答え"XMLオブジェクトの直列化復元のインタフェース."
を超えて、あなたのBinaryFormatterをバイナリーの直列化をXmlSerializer用XML思を十分に理解します。するために使用された一又はその他にも是非。
解決
その理由は、バイナリフォーマッタが直列化復元に直接インタフェースの種類できオブジェクトは直列化されたバイナリストリームメタデータを含む種類や組み立ての情報にこだわった、オブジェクトデータです。この場合、バイナリフォーマッタdeserializesのオブジェクトで知り、ビルドのオブジェクトでそのキャストするためのインタフェース型のオブジェクトを実装す.
XMLのシリアライザの滞在直列化へのスキーマのみ列化の公共分野の価値オブジェクトとないタイプの情報その他その例界面のタイプを実装す).
ここでは、 .純直列化, 比較すると、 BinaryFormatter, SoapFormatter, は、 XmlSerializer.また、結論については、以下のテーブルに加え、前述のとおりserializersの DataContractSerializer, NetDataContractSerializer や protobuf-net.
他のヒント
ただ体重を測るために...
2 つの明らかな違いは「バイナリと XML」ですが、それよりもさらに深い点があります。
- 田畑 (
BinaryFormatter
=bf) vs 公共 メンバー (通常はプロパティ) (XmlSerializer
=xs) - タイプメタデータベース (bf) とコントラクトベース (xs)
- 脆弱なバージョン (bf) とバージョン トレラント (xs)
- 「グラフ」(bf)対「ツリー」(xs)
- .NET 固有 (bf) とポータブル (xs)
- 不透明 (bf) と人間が読める形式 (xs)
その理由についての議論として BinaryFormatter
脆くなる可能性があります、 ここを参照してください.
どちらが大きいかについて議論することは不可能です。すべての型メタデータ BinaryFormatter
大きくすることができます。そして XmlSerializer
gzip のような圧縮を使用すると非常にうまく機能します。
ただし、それぞれの長所を活用することは可能です。たとえば、Google は独自のデータシリアル化形式である「プロトコル バッファー」をオープンソース化しました。これは:
- 契約ベースの
- ポータブル (参照 実装のリスト)
- バージョントレラント
- ツリーベースの
- 不透明 (ただし、.proto と組み合わせたときにデータを表示するツールはあります)
- 通常 "まずは契約する" ただし、一部の実装ではリフレクションに基づいた暗黙的なコントラクトが許可されています
しかし重要なのは、これは非常に高密度のデータ (型メタデータなし、純粋なバイナリ表現、短いタグ、可変長の Base-7 エンコードなどのトリック) であり、処理効率が非常に高い (複雑な XML 構造なし、メンバーに一致する文字列なしなど) ということです。 )。
私は少し偏見があるかもしれません。実装の1つを維持しています(C#/。ネットに適したいくつかを含む)が、リンクしていないことに注意してください どれでも 具体的な実装。この形式には独自のメリットがあります ;-p
XMLシリアライザは、XML、またXMLスキーマ(暗黙的に)を生成します。これは、このスキーマに準拠するXMLを生成します。
一つの意味は、それがXMLスキーマに記述することができないものをシリアル化しないことです。例えば、そこにリストおよびXMLスキーマの配列を区別する方法はありませんので、シリアライザによって生成されたXMLスキーマは、いずれかの方法を解釈することができる。
(BinaryFormatter
はの一部である)ランタイムシリアライズは反対側に、実際の.NETの型をシリアル化し、あなたがList<int>
を送信するので、もし、他の側はList<int>
を取得します。
他の側は、.NETを実行している場合、明らかに良く動作すること。
のXmlSerializer公共ゲッターと公共セッター(および任意のパブリックフィールド)の両方を持っているすべてのタイプのプロパティを読み取ることによって型をserialises。この意味でのXmlSerializerは、/は、インスタンスの「パブリックビュー」をデシリアライズシリアライズします。
バイナリフォーマッタは、対照的に、即ちインスタンスの「内部」、そのフィールドをシリアル化することによって型をシリアル化します。 [NonSerialized]としてマークされていない任意のフィールドは、バイナリストリームにシリアライズされます。型自体は、シリアル化もされなければならない任意の内部フィールドとして[直列化]としてマークされなければならない。
私は推測する最も重要なものの一つは、他の一つは公共のものでのみ動作し、一方、バイナリシリアルは、パブリックとプライベートの両方のメンバーをシリアル化できることです。
ここでは、サイズの点ではこれら二つの間に非常に役立つの比較を提供します。あなたがリモートマシンにシリアル化されたオブジェクトを送信することがありますので、非常に重要な問題です。
ます。http: //www.nablasoft.com/alkampfer/index.php/2008/10/31/binary-versus-xml-serialization-size/する