.NETバイナリは、他のオブジェクトへの参照を持つオブジェクトをシリアライズします。..何が起こるの?

StackOverflow https://stackoverflow.com/questions/4905768

質問

他のオブジェクト(インスタンスBとCなど)を参照するオブジェクトインスタンスAがあり、aをファイルにバイナリシリアル化すると、どうなりますか?これで、a、B、Cを含むシリアル化されたデータがありますか?

それはどのように正確に動作しますか?データを逆シリアル化すると何が得られますか?A、B、C??

(同様に内部の仕組みの説明を含めること自由に感じます)。

役に立ちましたか?

解決

他のオブジェクトへの参照もすべてシリアル化されます。 データを逆シリアル化すると、オブジェクトA、B、およびCを含む、そのデータの完全な作業セットになります。これはおそらく、xmlシリアル化とは対照的に、バイナリシリアル化の主な利点です。

あなたのオブジェクトが参照を保持している他のクラスのいずれかがマークされていない場合 [Serializable] 属性, 、あなたは得るでしょう SerializationException 実行時に(その画像は恥知らずにウェブから盗まれました;現在のバージョンのVSでは、ランタイムエラーはもうこのようには見えません):

    Example of an unhandled SerializationException

それ以上に、私はあなたが理解したいと思っていた「内部的なもの」が本当にわかりません。シリアル化の使用 反射 オブジェクトのパブリックフィールドとプライベートフィールドを歩き、それらをバイトのストリームに変換し、最終的にデータストリームに書き出されます。逆シリアル化中に、逆が発生します:バイトのストリームは、型情報とともにオブジェクトの正確な複製を合成するために使用されるデータストリームから読み込まれます。オブジェクト内のすべてのフィールドには、以前に保持していた値と同じ値があります;コンストラクタは次のとおりです ない オブジェクトが逆シリアル化されたときに呼び出されます。それについて考える最も簡単な方法は、あなたが単に取っているということです スナップショット-イン-プレース オブジェクトの、あなたが自由に元の状態に復元することができます。

実際のシリアライズと逆シリアル化を担当するクラスはフォーマッタと呼ばれます(常にシリアライズを継承します)。 IFormatter インターフェイス).これは、ルートとしてシリアル化/逆シリアル化されているオブジェクトを含む一般化されたツリーです。上記のように、フォーマッタはリフレクションを使用してこのオブジェクトグラフを歩き、そのオブジェクトに含まれるすべてのオブジェクト参照をシリアライズ/逆シリアル化します。また、フォーマッタは、グラフ内のオブジェクトを複数回シリアル化しないことを知るのに十分なインテリジェントです。2つのオブジェクト参照が実際に同じオブジェクトを指している場合、これは検出され、そのオブジェクトは1回だけシリアル化されます。このロジックと他のロジックは、無限ループに入るのを防ぎます。

もちろん、このプロセスがどのように機能するかを一般的に理解するのは簡単です。それは 多くの 実際にそれを実装するコードを自分で書くのは難しいです。幸いなことに、それはすでにあなたのために行われています。NET Frameworkのポイントの一部は、この複雑なシリアル化ロジックがすべて組み込まれているため、心配することはありません。私はそれのすべてを自分で理解すると主張していないし、あなたは確かにそれが提供する機能を最大限に活用する必要はありません。そのコードをすべて手作業で書いてきた年月はついに終わりました。実装の詳細を心配するのではなく、喜んでいる必要があります。:-)

他のヒント

まず、オブジェクトAのタイプに[Serializable]属性のタグを付ける必要があります。シリアル化Aは、メンバーのタイプにも[Serializable]のタグが付けられている場合(または、BとCのタイプが[Serializable]のマークが付いている場合)、プライベートまたはパブリックのすべてのメンバーデータをシリアル化します。[Serializable]ではないタイプのデータを直接的または間接的にシリアル化しようとすると、例外が発生します。

System.Int32(int)、System.Boolean(bool)など、多くの組み込み.NETタイプはすでに[Serializable]としてマークされています。

.NETシリアル化の詳細については、 http:// msdnを参照してください。microsoft.com/en-us/library/4abbf6k0.aspx

メインオブジェクトによって参照されるオブジェクトも[Serializable]である必要があります。そのための提供はすべて、フォーマッターによって自動的に行われます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top