連載

.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#版

 これを実行した結果は次のとおり。

山田太郎
17
山田二郎
16
山田三郎
15

 生成される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クラスをシリアライズすることは難しくない。


 INDEX
  .NETで簡単XML
  第11回 オブジェクトをXMLでシリアライズ(3)
    1.派生クラスを含む配列のシリアライズ
    2.派生クラスを含む配列をシリアライズするプログラムの内容
    3.要素のシーケンスとしての配列のシリアライズ
  4.ArrayListオブジェクトのシリアライズ
    5.自作コレクションのシリアライズ
 
インデックス・ページヘ  「連載 :.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 記事ランキング

本日 月間