![]() ![]() ![]() |
![]() |
||
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:シリアライズ可能なクラス
次に、このクラスがきちんとシリアライズされ、シリアライズされたデータが元通りに デシリアライズされるかどうかを確認する方法を見てゆきましょう。 今回はバイナリシリアライズの確認なので、「BinaryFormatter」を使用します。 ここでは詳しく説明しませんが、SOAPシリアライズの場合はSoapFormatter、 XMLシリアライズの場合はXmlSerializerを使用します。 BinaryFormatterのSerializeメソッドでは、シリアライズされたオブジェクトをStreamに流すことになります。 StreamにはもちろんMemoryStreamや他のStreamも使用可能ですが、 FileStreamを使用するとバイナリエディタなどで中身を確認することができるので、 今回はFileStreamを使用しています。 リスト2に簡単な確認のコードを示します。 このコードを利用すると、上記のように、BinaryFormatterのSerializeメソッドで、 SerializableClassがFileStream中にシリアライズされ、 次にFileStreamからきちんとデシリアライズされていることを確認できます。 リスト2:シリアライズ/デシリアライズの確認
|
||||||||||||
.NET Roomトップへ | ページトップへ | 次へ![]() |