MSDN Magazine Archivesは宝の山

ここ数日ずっともやもやしてきた、.NETにおけるフォーマッタのシリアライズ/デシリアライズに関してですが、MSDN Magazineのアーカイブスにあった素晴らしい一連の記事のおかげで、殆どの疑問が氷解しました。

.NET: Run-time Serialization -- MSDN Magazine, April 2002

.NET: Run-time Serialization, Part2 -- MSDN Magazine, July 2002

.NET: Run-time Serialization, Part 3 -- MSDN Magazine, September 2002

2002年とかなり古い記事ではありますが、.NETの基本的な技術に関しての解説ですので中身を.NET2.0に置き換えてもその殆どは通用します。従って、.NETにおけるオブジェクトのシリアル化/逆シリアル化(※)の基本を深く知るためには非常に御薦めです。
(※"シリアライズ/デシリアライズ"が一般的な呼び方ですがMicrosoftではこのように訳しているので、ここでは統一します)

私として、特に有用だった部分は以下の通りです。


・SerializeAttributeが適用された.NETオブジェクトの、シリアル化/逆シリアル化の手順
・ISerializableの実装による、シリアル化/逆シリアル化のカスタマイズ
・Singletonオブジェクトのシリアル化/逆シリアル化と、Singletonであることの保証
・ISerializationSurrogateインタフェースによる、代替シリアル化/逆シリアル化
・SerializationBinderによる、アセンブリと型のオーバライド

特に、Singletonオブジェクトのシリアル化/逆シリアル化に関しての解説は、私も以前の日記「Singleton across AppDomain」で言及していた、AppDomain越しのSingletonを生成する方法の一つであり、もっと以前にこの記事を読んでおけば良かったのになぁと、後悔しきりです。

先日言及したSerializationBinderを使うか否かの判断基準に関しても、この記事には掲載されており、結果として私がSerializationBinderクラスを用意したのは、間違いではなかったということも解りました。

SerializationBinderの派生クラスを用意した方が良いケース


・型の実装を別のアセンブリに移動させる場合。
 たとえばアセンブリのバージョン番号が変化して,新しいアセンブリがオリジナルのものとは異なるアセンブリとして扱われるようになった場合。

・サーバ上のオブジェクトがバイトストリームにシリアル化されてからクライアントに送られる場合。
 クライアントはそのストリームを処理する際に,そのオブジェクトをまったく別の型に逆シリアル化できる。ただしその型のコードは,サーバのオブジェクトに対するメソッド呼び出しをリモート処理する方法を知っている必要がある。

・型の新しいバージョンを作成する場合。
 このケースでは,すでにシリアル化されているオブジェクトをすべてその型の新しいバージョンに逆シリアル化することが必要になる。

Delphi, Java, .NET(C#)と、私のオブジェクト指向プログラミングの経験は、シリアライズ/デシリアライズという分野のプログラミングの経験でもあります。面倒ですが、非常に興味深い分野ですね。