他のオブジェクト (インスタンス B と C など) を参照するオブジェクト インスタンス A があり、A をファイルにバイナリ シリアル化するとどうなりますか? A、B、C を含むシリアル化されたデータはありますか?
正確にはどのように機能しますか?データを逆シリアル化すると何が得られますか? A、B、C??
(内部の仕組みの説明も自由に含めてください)。
他のオブジェクト (インスタンス B と C など) を参照するオブジェクト インスタンス A があり、A をファイルにバイナリ シリアル化するとどうなりますか? A、B、C を含むシリアル化されたデータはありますか?
正確にはどのように機能しますか?データを逆シリアル化すると何が得られますか? A、B、C??
(内部の仕組みの説明も自由に含めてください)。
他のオブジェクトへのすべての参照もシリアル化されます。データを逆シリアル化すると、オブジェクトA、B、Cを含む、データの完全なワーキングセットが作成されます。これは、XMLシリアル化とは対照的に、おそらくバイナリシリアル化の主な利点です。
オブジェクトが参照を保持している他のクラスのいずれかが[Serializable]
属性でマークされていない場合、実行時に取得SerializationException
されます(その画像は恥知らずにWebから盗まれました。実行時エラーは、次のようには見えません。これは、現在のバージョンのVSではもうありません):
それ以上に、あなたが何を理解したいと思っていたのか、私にはよくわかりません。シリアル化では、リフレクションを使用してオブジェクトのパブリックフィールドとプライベートフィールドをウォークスルーし、それらをバイトストリームに変換します。これは、最終的にデータストリームに書き出されます。デシリアライズ中に、逆のことが起こります。バイトのストリームがデータストリームから読み込まれ、タイプ情報とともにオブジェクトの正確な複製を合成するために使用されます。オブジェクト内のすべてのフィールドは、以前に保持していたものと同じ値を持っています。オブジェクトが逆シリアル化されるとき、コンストラクターは呼び出されません。それについて考える最も簡単な方法は、オブジェクトの代わりにスナップショットを作成するだけで、自由に元の状態に復元できることです。
実際のシリアル化と逆シリアル化を担当するクラスは、フォーマッターと呼ばれます(常にIFormatter
インターフェイスから継承します)。その仕事は、ルートとしてシリアル化/逆シリアル化されているオブジェクトを含む一般化されたツリーである「オブジェクトグラフ」を生成することです。上記のように、フォーマッタはリフレクションを使用してこのオブジェクトグラフをウォークスルーし、そのオブジェクトに含まれるすべてのオブジェクト参照をシリアル化/逆シリアル化します。フォーマッタは、グラフ内のオブジェクトを複数回シリアル化しないことを認識できるほどインテリジェントです。2つのオブジェクト参照が実際に同じオブジェクトを指している場合、これが検出され、そのオブジェクトは1回だけシリアル化されます。このロジックおよびその他のロジックは、無限ループに入るのを防ぎます。
もちろん、このプロセスがどのように機能するかを一般的によく理解するのは簡単です。それを実装するコードを実際に自分で書くのははるかに困難です。幸いなことに、それはすでにあなたのために行われています。.NET Frameworkのポイントの一部は、この複雑なシリアル化ロジックがすべて組み込まれているため、心配する必要がないことです。私はそれのすべてを自分で理解しているとは主張していません、そしてあなたは確かにそれが提供する機能を最大限に活用するためにどちらかをする必要はありません。そのすべてのコードを手作業で書いていた年月はついに終わりました。実装の詳細について心配するのではなく、喜ぶべきです。:-)
まず、オブジェクト A のタイプに [Serializable] 属性をタグ付けする必要があります。メンバーの型も [Serializable] でタグ付けされている場合 (または、例を使用すると、B と C の型が [Serializable] とマークされている場合)、A をシリアル化すると、プライベートまたはパブリックのすべてのメンバー データがシリアル化されます。[Serializable] でないタイプのデータを直接的または間接的にシリアライズしようとすると、例外が発生します。
System.Int32 (int)、System.Boolean (bool) など、組み込みの .NET 型の多くは既に [Serializable] としてマークされています。
.NET シリアル化の詳細については、http: //msdn.microsoft.com/en-us/library/4abbf6k0.aspxを参照してください。
メインオブジェクトが参照するオブジェクトも[シリアライズ可能]である必要があります。その提供はすべて、フォーマッターによって自動的に行われます。