シリアル化の概念Serialization concepts

シリアル化が必要となる理由について考えてみます。Why would you want to use serialization? 最も重要な理由として、オブジェクトの状態をストレージ メディアに保持し、後の段階で同一コピーを再作成できるようにすることと、アプリケーション ドメイン間でオブジェクトを値渡しで送信することの 2 つが挙げられます。The two most important reasons are to persist the state of an object to a storage medium so an exact copy can be re-created at a later stage, and to send the object by value from one application domain to another. たとえば、シリアル化は ASP.NET でのセッション状態を保存したり、オブジェクトを Windows フォームのクリップボードにコピーしたりするために使用されます。For example, serialization is used to save session state in ASP.NET and to copy objects to the Clipboard in Windows Forms. また、リモート処理でオブジェクトを 1 つのアプリケーション ドメインから別のアプリケーション ドメインに値渡しするためにも使用されます。It is also used by remoting to pass objects by value from one application domain to another.

警告

バイナリ シリアル化は危険です。Binary serialization can be dangerous. 信頼できないソースからのデータの逆シリアル化、および管理下にないシステムへのラウンドトリップのシリアル化をしてはいけません。Never deserialize data from an untrusted source and never round-trip serialized data to systems not under your control.

永続ストレージPersistent storage

オブジェクトのフィールドの値をディスクに格納しておき、後でこのデータを取得する必要が生じることはよくあります。It is often necessary to store the value of the fields of an object to disk and then, later, retrieve this data. これはシリアル化を使用しなくても簡単に実現できますが、シリアル化を使用しない方法は煩雑でエラーの原因となることが多く、オブジェクトの階層を追跡する必要がある場合にはさらに複雑になります。Although this is easy to achieve without relying on serialization, this approach is often cumbersome and error prone, and becomes progressively more complex when you need to track a hierarchy of objects. 何千ものオブジェクトを含む大規模なビジネス アプリケーションを作成し、それぞれのオブジェクトのフィールドやプロパティをディスクに保存したり、ディスクから復元したりするコードを記述することを想像してみてください。Imagine writing a large business application, that contains thousands of objects, and having to write code to save and restore the fields and properties to and from disk for each object. シリアル化は、この目的を実現するための便利なメカニズムを提供します。Serialization provides a convenient mechanism for achieving this objective.

共通言語ランタイムは、オブジェクトがメモリに格納される方法を管理し、リフレクションを使用して自動シリアル化のメカニズムを提供します。The common language runtime manages how objects are stored in memory and provides an automated serialization mechanism by using reflection. オブジェクトをシリアル化すると、クラスの名前、アセンブリ、およびそのクラス インスタンスのすべてのデータ メンバーがストレージに書き込まれます。When an object is serialized, the name of the class, the assembly, and all the data members of the class instance are written to storage. オブジェクトのメンバー変数には、他のインスタンスへの参照が格納されていることがよくあります。Objects often store references to other instances in member variables. クラスをシリアル化するとき、シリアル化エンジンは、既にシリアル化されている参照先オブジェクトを追跡し、同じオブジェクトが複数回シリアル化されないようにします。When the class is serialized, the serialization engine tracks referenced objects, already serialized, to ensure that the same object is not serialized more than once. シリアル化アーキテクチャは、正しく指定されて、.NET Framework と共にグラフおよび循環参照が自動的にオブジェクトのハンドル。The serialization architecture provided with the .NET Framework correctly handles object graphs and circular references automatically. オブジェクト グラフに対する唯一の要件は、シリアル化されたオブジェクトによって参照されるすべてのオブジェクトを、Serializable としてもマークすることです (詳細については、「基本的なシリアル化」を参照)。The only requirement placed on object graphs is that all objects, referenced by the serialized object, must also be marked as Serializable (for more information, see Basic Serialization). Serializable としてマークしないと、マークされていないオブジェクトをシリアライザーがシリアル化しようとしたときに例外がスローされます。If this is not done, an exception will be thrown when the serializer attempts to serialize the unmarked object.

シリアル化されたクラスを逆シリアル化すると、そのクラスが再作成され、すべてのデータ メンバーの値は自動的に復元されます。When the serialized class is deserialized, the class is recreated and the values of all the data members are automatically restored.

値渡しによるマーシャリングMarshal by value

オブジェクトは、作成されたアプリケーション ドメイン内でのみ有効です。Objects are valid only in the application domain where they are created. オブジェクトをパラメーターとして渡したり、結果として返したりする処理を試行すると、そのオブジェクトが MarshalByRefObject から派生しているか、または Serializable としてマークされている場合を除いて、その試行は失敗します。Any attempt to pass the object as a parameter or return it as a result will fail unless the object derives from MarshalByRefObject or is marked as Serializable. Serializable としてマークされていると、オブジェクトは自動的にシリアル化され、アプリケーション ドメイン間で転送されます。その後、逆シリアル化され、転送先のアプリケーション ドメインにそのオブジェクトの同一コピーが作成されます。If the object is marked as Serializable, the object will automatically be serialized, transported from the one application domain to the other, and then deserialized to produce an exact copy of the object in the second application domain. この処理は一般に、値渡しによるマーシャリングと呼ばれます。This process is typically referred to as marshal-by-value.

オブジェクトが MarshalByRefObject から派生している場合は、そのオブジェクト自体ではなく、オブジェクト参照がアプリケーション ドメイン間で渡されます。When an object derives from MarshalByRefObject, an object reference is passed from one application domain to another, rather than the object itself. MarshalByRefObject から派生したオブジェクトを Serializable としてマークすることもできます。You can also mark an object that derives from MarshalByRefObject as Serializable. このオブジェクトがリモート処理で使用されると、サロゲート セレクター (SurrogateSelector) によって事前構成された、シリアル化を実行するフォーマッタがシリアル化プロセスを制御し、MarshalByRefObject から派生したすべてのオブジェクトをプロキシに置き換えます。When this object is used with remoting, the formatter responsible for serialization, which has been preconfigured with a surrogate selector (SurrogateSelector), takes control of the serialization process, and replaces all objects derived from MarshalByRefObject with a proxy. SurrogateSelector を使用しない場合、シリアル化アーキテクチャは「シリアル化プロセスの手順」で説明されている標準のシリアル化のルールに従います。Without the SurrogateSelector in place, the serialization architecture follows the standard serialization rules described in Steps in the Serialization Process.

バイナリ シリアル化Binary Serialization
共通言語ランタイムに付属しているバイナル シリアル化機構について説明します。Describes the binary serialization mechanism that is included with the common language runtime.

.NET リモート処理\.NET Remoting\ .NET Framework でリモート通信に利用できるさまざまな通信方法について説明します。Describes the various communications methods available in the .NET Framework for remote communications.

XML シリアル化および SOAP シリアル化XML and SOAP Serialization
共通言語ランタイムに付属している XML シリアル化および SOAP シリアル化機構について説明します。Describes the XML and SOAP serialization mechanism that is included with the common language runtime.