|
|
連載
.NETで簡単XML
第11回 オブジェクトをXMLでシリアライズ(3)
株式会社ピーデー 川俣 晶
2003/11/22 |
|
|
ArrayListオブジェクトのシリアライズ
ここまで見てきたように、シリアライズ関連の機能には、配列を対象とした場合に特別な機能を発揮するものがある。配列を含むクラスをシリアライズする場合には力になってくれることだろう。しかし、実際にプログラムを作成する場合、データの集まりを表現するために配列を使うとは限らない。.NET Frameworkのクラス・ライブラリには、ArrayListクラスなど個性豊かな「コレクション」と呼ばれるクラス群があり、それらを配列の代わりに使うこともあるためだ。もちろん、新規にそのようなクラスを自作する場合もあるだろう。そのようなクラスを使った場合、シリアライズはどうなるのだろうか。
次に示すのは、配列の代わりにArrayListクラス(System.Collections名前空間)を使用した例である。前回のサンプル・プログラム5-2と共通の部分は再掲しない。相違のあるPersonクラスだけ掲載する。
Public Class Persons
<XmlArrayItem(Type:=GetType(Person))> _
Public persons As ArrayList
Public Sub SetPersons(ByVal person1 As Person, ByVal person2 As Person, ByVal person3 As Person)
persons = New ArrayList
persons.Add(person1)
persons.Add(person2)
persons.Add(person3)
End Sub
Public Sub Dump()
For Each person As Person In persons
Trace.WriteLine(person.Name)
Trace.WriteLine(person.Age)
Next
End Sub
End Class |
|
サンプル・プログラム3:配列の代わりにArrayListクラスを使う例(VB.NET版/C#版) |
これを実行した結果は次のとおり。
生成されるXML文書は以下のようになる。
<?xml version="1.0"?>
<Persons xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<persons>
<Person>
<Name>山田太郎</Name>
<Age>17</Age>
</Person>
<Person>
<Name>山田二郎</Name>
<Age>16</Age>
</Person>
<Person>
<Name>山田三郎</Name>
<Age>15</Age>
</Person>
</persons>
</Persons> |
|
生成されるXML文書 |
このように、ArrayListクラスを使った場合でも、配列と同じようにシリアライズすることができる。しかし、完全に同じというわけではない。ArrayListクラスのフィールドを宣言している部分にXmlArrayItem属性が付いていることに注意していただきたい。Personクラスの配列に、Personクラスのインスタンスへの参照を代入している場合、XmlArrayItem属性は不要だった。なぜ、ArrayListクラスではこれが必要なのだろうか。
その理由は少し考えると分かるだろう。Personクラスの配列は、それがPerson型を入れるための宣言されたことが明示されている。しかし、ArrayListクラスはクラス・ライブラリの中にあるもので、自作クラスであるPersonクラスのことなど何も知らない。ArrayListクラスは、あくまでObject型を格納するために作成されたものであり、Personクラスのインスタンスへの参照が格納できるのは、Personクラスが暗黙のうちにObject型を継承している派生クラスであるためである。派生クラスのインスタンスの参照を入れるのであれば、XmlArrayItem属性が必要とされるわけである。
あくまで派生クラスのインスタンスを扱っているのだということに注意を払えば、ArrayListクラスをシリアライズすることは難しくない。
Insider.NET 記事ランキング
本日
月間