XMLでシリアル化

O
bject BLVD
オブジェクト 散歩道
の
例題でわかる! .NET Framework
第
7
回
「XMLでシリアル化」
吉田 弘一郎
YOSHIDA, Koichiro
ことにします。要するに、XML文書に
Technology Tools
XML
情報を書き出したり、逆に読み込んだ
りするのですが、ここではXMLの細か
✓ Visual Basic .NET
先月に続いてXMLの話です。先月は、
Visual C# .NET
SQL Server 2000
Oracle 9i
正面からXMLに取り組んだので少々疲
一種の馬鹿チョンモードで知らないう
れましたね。今月は、XMLそのものに
ちにXMLすることにしましょう。
Access 2002
は直接手を触れず、上手に応用するこ
ASP.NET
とに徹しましょう。実際、XMLを自分
Internet Information Services
で直接扱う機会は極めて少ないものと
✓ Other:
い部分にはまったく触れることなく、
シリアル化とは何か
思われます。ちょっとしたXML文書を
XML
書き出す程度ならまだしも、XML文書
シリアル化(Serialization)とは、文
の読み込みルーチンを自らプログラム
字通りシリアルにすること、つまり、
する羽目に追い込まれることは、ほと
構造をもっているかもしれないデータ
んどないはずだし、逆にあってはなら
を、さらにはオブジェクトを、バイト
Samples
ないのです。
“気が付いたらXMLを使
のストリームにしてしまうことです。
・この記事で取り上げたソースコードおよび
サンプルプログラムは、付録CD-ROMの
¥DOTNET¥SAMPOディレクトリに収
録しています。
っていた”という状況のほうがはるか
ここでは、XMLという条件を付けます
に多いのです。
ので、バイトのストリームとは、実は
Level
★ ★ ★ ★ ★
¥SAMPO07¥SAMPO07.SLN
今回紹介したサンプルのソリューションファ
イル
116
dotNET Magazine 2003 June
今月のテーマは「XMLを用いたシリ
XML文書となる文字列の流れになりま
アル化」です。すると、みなさんは即
す。要するに、データとかオブジェク
座にASPの話かなと思われるかもしれ
トをXML文書に変換してしまえば、フ
ません。ましてや、SOAPも使うという
ァイルなどに格納したり、ネットワー
ことになればなおさらです。実際、ASP
クで遠方に転送したりということが可
を使えば、あちこちにXMLが出てきま
能になるという話です。
す。しかし、ここでは、ASPなどよりは
それでは、何をシリアル化するので
はるかに初歩的なレベルで、XMLを用
しょう。
「データとかオブジェクト」で
いたシリアル化の例題をこなしてゆく
は、漠然としすぎていますので、ここ
「XMLでシリアル化」
では「オブジェクトのシリアル化」に
にするのです。
serializer.Serialize(writer, Tom)
話を限定してしまいます。しかし、ま
だ一般的過ぎます。オブジェクトは単
この1 行でできたXML 文書をInter
例題1:単一の
オブジェクト(VB01.vb)
net Explorerで見ると図1のとおり。た
ジェクト」ですから、オブジェクトの
例題1のソースコードVB01.vbをご覧
ようなXML文書を手作業で組み立てて
メソッドまでもシリアル化してしまう
ください(リスト1)
。Visual Basic 6.0
いましたが、ここでは一発でできてし
のでしょうか? もちろん、これは可
では、クラス定義はクラスファイル、
まいます。たしかに便利です。
能です。そもそも、PCで実行可能なプ
プログラムモジュールはプログラムフ
XMLシリアライザーは次のようにし
ログラムは、たとえばABC.EXEのよう
ァイルという具合にファイルが単位に
て作ります。生成子のパラメータは
な実行形式のファイルに収まっていま
なっていましたね。しかし、Visual
すが、これは「バイナリストリームに
Studio .NETでは、ひとつのソースファ
シリアル化されたプログラム」であり、
イルの中にクラス定義とプログラムモ
これがローダーによってメモリ上に逆
ジュールを混在させることができます。
シリアル化され、プログラム本体が再
この例題1でも、クラス定義とプログラ
出力用ファイルは、次のようにスト
現するのです。しかし、ここでは、そ
ムの部分を行き来しながら、どんな例
リームライターを作っておけばよいで
こまでは望みません。それどころか、
題にしようかなと考えることから始め
しょう。
次のようなレベルにまでシリアル化を
たのですが、ひとつのファイルで済む
限定してしまいます。
というのは便利です。
なるデータではないからです。
「データ構造+アルゴリズム=オブ
しかに動作しています。先月は、この
「シリアル化したいクラス」です。
Dim serializer As XmlSerializer = _
New XmlSerializer(GetType(Staff))
Dim writer As StreamWriter = _
New StreamWriter("../Vb01.xml")
さて、この例題の核心は、XMLシリ
オブジェクトの外部から読み書き
アライザー“XmlSerializer”です。こ
こうしてできたXMLシリアライザー
可能なパブリックなデータメンバ
れを用いると、オブジェクトが一発で
のSerialize関数を用いて、オブジェク
のみの自動化されたXMLシリアル化
XML文書に変換されてしまうのです。
トを出力ファイルにXML文書として書
XmlSerializer型オブジェクトをseriali
き出せばよいのです。
たとえば、次のようなStaffクラスが
zerとすれば、Staff型オブジェクトの
あるとします。ここには、3つのパブリ
Tom は次の 1 行で出力先のファイル
ックなデータがあり、これ以外にはパ
writerにXML文書として書き出されて
ブリックでないデータやさまざまなメ
しまうのです。
serializer.Serialize(writer, Tom)
また、XMLシリアル化の対象となる
ソッドがあるとします。
図1:例題1で書き出したXML文書(Vb01.xml)
Public Class Staff
Public SID As Integer
Public Name As String
Public EAddress As String
…
End Class
今月取り扱うXMLシリアル化の場合
には、このStaffクラスのオブジェクト
の3つのパブリックなデータのみを対象
dotNET Magazine 2003 June
117