.NET ROOM.NET ROOMトップへCOMRADE総合トップへ
「4:オブジェクトのシリアライズ」へ



4:オブジェクトのシリアライズ

 ・はじめに
 ・シリアライズとは?
 ・バイナリシリアライズ
 ・SerializableAttributeの問題点
 ・シリアライズ対象のフィールドを指定
 ・ISerializableインターフェイス
 ・Staticフィールドのシリアライズ
 ・シリアライズ可能でないクラスから派生クラスを作成
 ・最後に
 ・リフレクション

 ◆付録 (本稿で取り上げたソースコードおよびサンプルプログラム)
   \SerializeTest
     シリアライズ/デシリアライズの確認
   \PasswordHolderSerializeTest
     SerializableAttribute問題点1
   \IncorrectStaticFieldSerializeTest
     SerializableAttribute問題点2
   \StaticFieldSerializeTest
     Staticフィールドのシリアライズ
   \MultipleStaticFieldsTest
     複数のStaticフィールドのシリアライズ
   \ReflectionTest
     リフレクションを使用した、文字列による型の取得
   \ReflectionAndInterface
     リフレクションとインターフェイスの使用例

はじめに

 前回はカスタムクラスの設定をデザイン時に変更する方法について説明しましたが、
記事の最後で触れたように、このままでは設定の変更が反映されません。
設定値を永続化させる仕組みを実装していなかったからです。

 そこで今回は永続化の具体的な説明に入る前段階として、
独自クラスを永続化する際に必要となる“シリアライズ”について説明することにします。



シリアライズとは?

 「シリアライズ」とは、メモリ上にある情報の一部、あるいはすべてを、
ファイルとして保存したりネットワークで送受信したりできるように変換することをいいます。
反対にシリアライズされたデータから、ソフトウェアで扱うことのできる元のデータ形式に直し、
メモリに復元することを「デシリアライズ」といいます。
これを広義のシリアライズと呼ぶことにしましょう。
その場合、Visual Studio .NET(以下VS.NET)のコード生成もシリアライズに該当します。

 ただし、ソフトウェアの世界で“シリアライズ”と言えば、
一般的には「バイナリシリアライズ」を指す場合が多いでしょう。
このほか、XMLシリアライズなどもあります。

.NET Frameworkには、バイナリ/XMLの両方でシリアライズ/デシリアライズを
簡単に扱える仕組みが備わっていますが、本稿ではXMLでのシリアライズに関しては扱いません。
以降では、バイナリシリアライズに関して説明してゆきます。


ページトップへ


バイナリシリアライズ

 バイナリシリアライズを実装するのは比較的難しい部類に入ります。
しかし、前述のとおり、.NET Frameworkに備わっている仕組みを利用することにより、
簡単に実装することができます。

 もっとも簡単な方法はシリアライズしたい型に対して、「SerializableAttribute」を指定する方法です。
簡単なサンプルをリスト1に示します。
これを見るとわかるように、単純にSerializableAttributeを指定するだけで実装できます。

リスト1:シリアライズ可能なクラス
[Serializable]
public class SerializableClass {
 int data;
 public SerializableClass(int data) {
  Data = data;
 }
 public int Data {
  get { return data; }
  set { data = value; }
 }
}


 次に、このクラスがきちんとシリアライズされ、シリアライズされたデータが元通りに
デシリアライズされるかどうかを確認する方法を見てゆきましょう。

 今回はバイナリシリアライズの確認なので、「BinaryFormatter」を使用します。
ここでは詳しく説明しませんが、SOAPシリアライズの場合はSoapFormatter、
XMLシリアライズの場合はXmlSerializerを使用します。

 BinaryFormatterのSerializeメソッドでは、シリアライズされたオブジェクトをStreamに流すことになります。
StreamにはもちろんMemoryStreamや他のStreamも使用可能ですが、
FileStreamを使用するとバイナリエディタなどで中身を確認することができるので、
今回はFileStreamを使用しています。

 リスト2に簡単な確認のコードを示します。
このコードを利用すると、上記のように、BinaryFormatterのSerializeメソッドで、
SerializableClassがFileStream中にシリアライズされ、
次にFileStreamからきちんとデシリアライズされていることを確認できます。

リスト2:シリアライズ/デシリアライズの確認
const string FILENAME = "test.bin";
SerializableClass sc = new SerializableClass(2), deserialized_sc;
BinaryFormatter bf = new BinaryFormatter();
using (FileStream fs = File.OpenWrite(FILENAME)) {
 bf.Serialize(fs, sc);
}
using (FileStream fs = File.OpenRead(FILENAME)) {
 deserialized_sc = (SerializableClass)bf.Deserialize(fs);
}
Console.WriteLine("Original : {0}, Deserialized : {1}",
            sc.Data, deserialized_sc.Data);



コマンドラインによるコードの確認方法
 まず、サンプルソースの入ったディレクトリを、わかりやすい位置にディレクトリごとコピーします。

 次に、OSの[スタート]メニューから[プログラム]-[Microsoft Visual Studio .NET 2003]-[Visual Studio.NETツール]-[Visual Studio .NET 2003コマンドラインプロンプト]を選択し、
VS.NETのコマンドラインプロンプトを実行します。
そして、目的のディレクトリ(ここでは“C:\SerializeTest”)で、

C:\SerializeTest> csc SerializeTest.cs

と入力すると、VC#コマンドラインコンパイラによってコンパイルされ、
“SerializeTest.exe”というアセンブリが生成されます。

生成後、

C:\SerializeTest> SerializeTest.exe

と入力すれば、EXEファイルを実行して確認することができます。
コマンドラインコンパイラのオプションについての詳細は、

C:\> csc /?

と入力すると表示されます。



.NET Roomトップへ | ページトップへ | 次へ