Serialization

今開発中のプログラムで,シリアライズ機能が必要になったため,MSDNを中心に調べてテストしてみました.
シリアル化:http://msdn2.microsoft.com/ja-jp/library/7ay27kt9(VS.80).aspx
SerializableAttribute:http://msdn2.microsoft.com/ja-jp/library/system.serializableattribute(VS.80).aspx
ISerializable:http://msdn2.microsoft.com/ja-jp/library/system.runtime.serialization.iserializable(VS.80).aspx


シリアル化の定義
http://msdn2.microsoft.com/ja-jp/library/72hyey7b(VS.80).aspxより抜粋

シリアル化は、オブジェクトの状態をストレージ メディアに保存するプロセスとして定義されています。
このプロセスの間に、オブジェクトのパブリック フィールドとプライベート フィールド、およびクラス名が、バイトのストリームに変換され、データ ストリームに書き込まれます。
その後、シリアル化されたオブジェクトを逆シリアル化すると、元のオブジェクトの正確なクローンが作成されます。


シリアル化するためには,その対象となるクラスにSerializable属性をつける必要があります.
またその方法には,BinaryFormatter,SoapFormatter,XMLSerializerの3つがあります.

BinaryFormatter
http://msdn2.microsoft.com/ja-jp/library/system.runtime.serialization.formatters.binary.binaryformatter(VS.80).aspx
シリアル化は,各メンバについて,private,publicに関係なく行われる.
.NET Framework Version1.1と2.0とで,互換性がある.


SoapFormatter
http://msdn2.microsoft.com/ja-jp/library/system.runtime.serialization.formatters.soap.soapformatter(VS.80).aspx
シリアル化は,各メンバについて,private,publicに関係なく行われる.
.NET Framework Version1.1と2.0とで,互換性がない.


XMLSerializer
http://msdn2.microsoft.com/ja-jp/library/system.xml.serialization.xmlserializer(VS.80).aspx
シリアル化は,publicフィールドとプロパティだけ.
propertyの場合,set,getの両方が定義されている必要がある.


バイナリシリアル化はオブジェクトを維持するために使用し,XMLシリアル化はデータの共有(外部とやりとり可能なpublicだけなので)に使用します.
また,バージョントレラントなシリアル化(VTS : Version Tolerant Serialization)をサポートしているようです.知りませんでした.
VTS:http://msdn2.microsoft.com/ja-jp/library/ms229752(VS.80).aspx
要は,古いバージョンの保存ファイル(シリアル化されたオブジェクトのファイル)があっても,気にせずにシリアライズ対象のクラスを変更できるということです(ファイルに保存されていないメンバは無視されるので).
なお,BinaryFormatterであれば,VTS機能の全てがサポートされています.