1

他のオブジェクト(インスタンスB、Cなど)を参照するオブジェクトインスタンスAがあり、バイナリをファイルにシリアライズするとどうなりますか? A、B、Cを含むデータをシリアル化しましたか?.NET Binary他のオブジェクトへの参照を使用してオブジェクトをシリアル化します。 。 。何が起こるのですか?

どのように正確に動作しますか?データを逆シリアル化するとどうなりますか? A、B、およびC?

(内部動作の説明も自由に入れてください)。

答えて

6

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

オブジェクトに参照が保持されているクラスのいずれかが[Serializable] attributeとマークされていない場合は、実行時にSerializationExceptionと表示されます(画像は恥知らずにWebから盗まれていますが、 「Tも、VSの現在のバージョンではもう次のようになり):

さらにより

        Example of an unhandled SerializationException

、私はあなたが理解するために望んでいたものを 『内部のもの』は本当にわかりません。シリアライズでは、reflectionを使用してオブジェクトのパブリックフィールドとプライベートフィールドを処理し、最終的にデータストリームに書き出されるバイトストリームに変換します。逆シリアル化の間、逆のことが起こります。バイトストリームがデータストリームから読み込まれ、タイプ情報と共にオブジェクトの正確な複製を合成するために使用されます。オブジェクト内のすべてのフィールドは、以前に保持していた値と同じです。コンストラクタは、オブジェクトが逆シリアル化されたときに呼び出されるではなく、です。これについて考える最も簡単な方法は、オブジェクトのスナップショットをにして元の状態に復元できることです。

実際のシリアライゼーションとデシリアライズを担当するクラスは、フォーマッタと呼ばれます(常にIFormatter interfaceから継承されます)。それは、 "オブジェクトグラフ"を生成することです。これは、ルートとしてシリアル化/逆シリアル化されているオブジェクトを含む一般化されたツリーです。前述のように、フォーマッタは、このオブジェクトグラフに含まれるすべてのオブジェクト参照をシリアライズ/デシリアライズするために、リフレクションを使用してこのオブジェクトグラフを処理します。フォーマッタは、グラフ内のオブジェクトを2回以上シリアライズしないことを知るのに十分なインテリジェントです。 2つのオブジェクト参照が実際に同じオブジェクトを指している場合、これが検出され、そのオブジェクトは一度しかシリアル化されません。このロジックと他のロジックは、無限ループに入るのを防ぎます。

もちろん、このプロセスの仕組みをよく理解していることは簡単です。 実際には自分で実装するコードを書くのが難しいです。幸いにも、それはすでにあなたのために行われています。 .NET Frameworkの要点の1つは、複雑なシリアル化ロジックがすべて組み込まれていることです。私はそれをすべて自分で理解していると主張していませんし、それが提供する機能を十分に活用する必要はありません。そのコードを手作業で書く年はやっと終わりました。実装の詳細を心配するのではなく、喜んでください。 :-)

+0

ありがとう、コーディー、まさに私が探していたものです。私が物事の中間的な働きを求めているのは、私が本当に理解していない限り、私がしなければ「ああ」を得るということです。私はそれを得るためにすべてを視覚化し、それを覚えなければならない。素晴らしい答えにもう一度感謝します。 – richard

+0

@リチャード:もちろん。私はそれがどうやっているのか理解しています、私は自分と同じ方法ですから。私はあなたがそれを理解しようとすべきではないことを越えようとしていませんでした。むしろ「ここからは信じられないほど複雑になる」ということであり、それがどのように機能するかを理解するためには少しの余分な知識は理解できません。とにかく、あなたは大歓迎です。 –

1

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

+0

...「すべて完了です」..私の質問はその部分についてですが、「すべて」は何ですか? LOL – richard

+2

@リチャード:彼は、他のオブジェクトへのすべての参照も同様にシリアライズされることを意味します。データを逆シリアル化すると、A、B、Cなどのデータの完全な作業セットが完成します。おそらく、*バイナリ*シリアル化の主な利点です。それらの他のクラスに '[Serializable]'とマークされていなければ、例外が発生します。 –

+0

@Cody:答えとあなたのコメントは私に答えを与えました。ありがとう! – richard

4

まず、オブジェクトAの型は[Serializable]属性でタグ付けされていなければなりません。シリアライズAは、メンバの型が[Serializable]でタグ付けされている場合(またはBおよびCの型が[Serializable]とマークされている場合は、サンプルを使用することを条件として)、すべてのメンバーデータをプライベートまたはパブリックにシリアル化します。 [Serializable]ではない型のデータを直接的または間接的に直列化しようとすると、例外が発生します。

の数組み込みの.NET型としてすでにマークされている[Serializableを]など可能System.Int32(int型)、可能System.Boolean(ブール値)、を含む

あなたは.NETの詳細を読むことができますここでのシリアル化:http://msdn.microsoft.com/en-us/library/4abbf6k0.aspx

関連する問題