連載

.NETで簡単XML

第13回 オブジェクトをXMLでシリアライズ(5)

株式会社ピーデー 川俣 晶
2004/01/21
Page1 Page2 Page3

SoapFormatterの姉妹クラス、BinaryFormatterクラス

 これはこの連載の趣旨からは完全に逸脱した余談である。

 SoapFormatterには血を分けた兄弟、BinaryFormatterクラス(System.Runtime.Serialization.Formatters.Binary名前空間)が存在する。これは、同じIFormatterインターフェイス(System.Runtime.Serialization名前空間)を実装していて、同じようにシリアライズとデシリアライズができるクラスなのだが、シリアライズ対象をXML文書ではなく、独自のバイナリ・ファイルとする点で異なっている。

 参考までに、これを使用したサンプル・ソースを以下に示す。SoapFormatterクラスを使った場合とほぼ同じなので、相違点のみ示す。

 まず最初に、Importsステートメント(C#ではusingステートメント)で指定するSystem.Runtime.Serialization.Formatters.Soap名前空間は、System.Runtime.Serialization.Formatters.Binaryに書き換える。

 次に、System.Runtime.Serialization.Formatters.Soap.dllをプロジェクトの参照に追加する必要はない。これは“Serialization.Formatters.Soap”という文字列から明らかなようにSOAPでフォーマットするシリアライズのためのアセンブリであるから、不要になるのは当然といえる。では、その代わりに、System.Runtime.Serialization.Formatters.Binary.dllのようなアセンブリの参照を加える必要があるかというと、そうではない。特別に、特定の参照を追加する必要はない。BinaryFormatterクラスは、標準で参照されるmscorlib.dll内に含まれているためである。

 では、シリアライズとデシリアライズを行うメソッドのソースを以下に示す。

Private Sub serializeSample()
  Dim person As Person = New Person
  person.Name = "山田太郎"
  person.Age = 17
  person.SetTemporaryID(DateTime.Now.ToString())

  Dim formatter As BinaryFormatter = New BinaryFormatter
  Dim stream As Stream = New FileStream("c:\sample.bin", FileMode.Create)
  Try
    formatter.Serialize(Stream, person)
  Finally
    stream.Close()
  End Try
End Sub

Private Sub deserializeSample()
  Dim formatter As BinaryFormatter = New BinaryFormatter
  Dim person As Person
  Dim stream As Stream = New FileStream("c:\sample.bin", FileMode.Open)
  Try
    person = CType(formatter.Deserialize(stream), Person)
  Finally
    stream.Close()
  End Try
  person.Dump()
End Sub
サンプル・プログラム3:BinaryFormatterクラスを使用したシリアライズ/デシリアライズ(VB.NET版C#版

 これを実行すると、以下のような出力が得られる。

山田太郎
未設定
17
2003/12/08 10:45:57
サンプル・プログラム3の出力結果

 また、以下のような内容のバイナリ・ファイルが「c:\sample.bin」に生成される。

BinaryFormatterクラスによって生成されたバイナリ・ファイル
生成されたファイルをバイナリ・エディタで開いたところ。

 この画面の右側にあるバイナリ・データのASCII文字コード表示を見るとかなり読める文字があるものの、それ以外の部分はASCII文字コードでは表示できない意味不明の16進数の並びとなっている。その代わり、SoapFormatterクラスを使うよりも、処理は速い。SoapFormatterクラスと、BinaryFormatterクラスは、完全に呼び出す仕様が一致しているわけではないが、かなりのところまで同じと見なせるので、容易に交換ができる。そのため、SoapFormatterクラスを使っていて、どうしても速度が足りない場合は、(XML文書ではなくなってしまうが)BinaryFormatterクラスに置き換えるという対策をすぐに試せる。また、BinaryFormatterクラスを使ったプログラムをデバッグ中に、どうしても動作が分からない場合は、一時的にSoapFormatterクラスを使うように書き換えて、XML文書を出力させることができる。XML文書の方が、内容が分かりやすいので、デバッグの助けになるだろう。

 さて、今回はここまでである。次回も引き続き、SoapFormatterクラスのシリアライズについての内容で、ISerializableインターフェイスを用いたシリアライズの制御や、XML Webサービス経由で使われるシリアライズについて解説する。次回も乞うご期待である。End of Article


 INDEX
  .NETで簡単XML
  第13回 オブジェクトをXMLでシリアライズ(5)
    1.SoapFormatterを使ったシリアライズ
    2.シリアライズさせないフィールド
  3.SoapFormatterの姉妹クラス、BinaryFormatterクラス
 
インデックス・ページヘ  「連載 :.NETで簡単XML」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間