2009-05-30 14 views
6

シリアル化(バイナリシリアル化)では、どのデータが転送されていますか?クラス(オブジェクト)のインスタンスまたはそのオブジェクトのプロパティに割り当てられた値。シリアル化で渡されるデータは何ですか? (バイナリシリアル化)

基本的にシリアル化プロセスで何が起こるか知りたいですか?つまり、オブジェクトがターゲットファイルに変換されたり、シリアル化されたものに変換されたりします。しかしどうですか?このプロセスではどのような手順に従いますか?

誰かが助けることができますか?

バイナリシリアル化を使用するときにジェイ...デフォルトで

答えて

1

は、タイプのフィールドのみがシリアル化されます。プロパティはメソッドとして扱われ、シリアライゼーションには影響しません。

Xmlシリアル化を使用する場合、パブリックプロパティはデフォルトでシリアル化されます。

+0

フィールド自体またはそれに割り当てられた値ですか? –

+0

フィールドまたはそれに割り当てられた値またはその両方ですか? –

+0

xmlシリアル化では、パブリックフィールド+プロパティにread *および* writeアクセサーの両方を指定します。 [XmlIgnore]とマークされていないもの。または 'IXmlSerializable'が最初のdibsを持っています;-p –

4

BinaryFormatterとします。それは依存します; -p

シリアライゼーションの目的は、複雑なメモリ内オブジェクトを、単純なバイトシーケンス(またはシリアライザ - 文字など)に応じて表現することです。オブジェクトを再作成します。

いくつかの型(プリミティブ、文字列など)は、シリアライザによって直接組み込みサポートされています。

クラスの場合には、(アセンブリなど名incuding)タイプのメタデータが書き込まれ、その後、すべてのタイプにフィールドのは、(プライベートなどを含む、本質的にType.GetFields())が挙げられます。すべてのフィールド([NonSerialized]と表示されていない)については、フィールド名が書き込まれ、値は(同じプロセスを通じて)シリアル化されます。最終的には、組み込みのプリミティブ、いくつかの型定義、およびいくつかの名前/値フィールドの組み合わせに至るまですべてが沸騰します。

ここでの例外は、型がISerializableを実装している場合です。この場合、型は出力自体を直列化するように求められます。これは、辞書型のようなものでは一般的です。型のメモリ内レイアウトはストリームとは異なって表現できます。

デシリアライズ中は、プロセスは逆になります。特殊な直列化コンストラクタ/ ISerializableを持たない限り、型メタデータを使用して空のオブジェクトを作成します。フィールドはストリーム内で見つかったときに設定されます。

シリアライズとデシリアライズの両方で、(デ)シリアライゼーション用のオブジェクトを修正するための追加コードを実行できる「コールバック」ポイントがあります。

このプロセスは脆弱です。多くの理由で、see here - しかし、それはまた、バージョンが許されておらず、実装固有です(あなたはjavaなどからそれを消費することはできません)。

protobuf-net契約ベース、というよりもフィールドベースあるバイナリシリアライザであることによって、これらの問題の多くを解決します。


+1

自動プロパティはどうですか?そのバッキングフィールドはシリアル化されていますか? あなたはprotobuf-netに言及して以来、ここにリンクがあります:http://code.google.com/p/protobuf-net/ – M4N

+1

自動プロパティ:はいそうです。しかし、それは*特に*脆弱ですなぜここに "参照してください"リンクを参照してください。私はprotobuf-netリンクを入れるように編集しますが、私はすでにかなりよく知っています.-p –

+0

ありがとう。ところで、私はあなたがリンクを知っていることを知っていた、私は他の読者のためにそれを追加しました:) – M4N

5

バイナリシリアライズは、オブジェクトのスナップショットを取ってそれをシリアル化しています。 NonSerializableとしてマークされていないすべてのプライベートフィールドは、その値でシリアル化されます。 オブジェクト階層で使用されるすべてのオブジェクトは、シリアライズ可能として作成する必要があります。イベントの属性なので、イベントハンドラは、あまりにも連載されません:[非直列化フィールド]: あなたは置くべきhttp://bytes.com/groups/net-c/250944-nonserialized-attribute-events#post1013968

は、オブジェクトをデシリアライズするとき、あなたはあなたのと同じアセンブリ内のまったく同じオブジェクトを持っている必要があることに注意してくださいそれをシリアル化しました(同じアセンブリ情報と同じ意味です)。そうでない場合は、SerializationBinderクラスを使用して、ストリームを消毒するタイプをリセットすることができます。

+1

はい!この[field:NonSerializable]属性は非常によく知っています。このコードでは、イベントで属性を使用しないときに偽のシリアライゼーション例外が発生するだけで、例外がスローされた理由を完全に暗闇の中に残すことができます。 – Dabblernl

+0

Pedant:[field:NonSerializable]は、「フィールドのようなイベント」にのみ適用されます。他のイベント実装(明示的フィールド、EventHandlerListなど)では、フィールドに直接マークを付けます。 –

+0

typo:sterlized? –

関連する問題