|
|
連載
.NETで簡単XML
第10回 オブジェクトをXMLでシリアライズ(2)
株式会社ピーデー 川俣 晶
2003/10/29 |
|
|
名前空間の指定
要素名や属性名が指定できるなら、次に欲しくなるのは、それらの要素や属性の名前空間URIの指定である。もちろん、それは実現できる。以下に名前空間URIを指定したシリアライズの例を示す。
ここではクラスの定義のみを示している。シリアライズなどの処理は、「属性の指定」などのサンプル・プログラムと同一であるので繰り返さない。
<XmlRoot("個人情報", Namespace:="http://www.atmarkIT.co.jp/xmlns/sample/person")> _
Public Class Person
Private m_name As String = "未設定"
Private m_age As Integer = 0
<XmlElement("名前", Namespace:="http://www.atmarkIT.co.jp/xmlns/sample/name")> _
Public Property Name() As String
Get
Return m_name
End Get
Set(ByVal Value As String)
m_name = Value
End Set
End Property
<XmlElement("年齢", Namespace:="http://www.atmarkIT.co.jp/xmlns/sample/age")> _
Public Property Age() As Integer
Get
Return m_age
End Get
Set(ByVal Value As Integer)
m_age = Value
End Set
End Property
Public Sub Dump()
Trace.WriteLine(m_name)
Trace.WriteLine(m_age)
End Sub
End Class
|
|
サンプル・プログラム4:名前空間URIを指定したシリアライズの例(VB.NET版/C#版) |
これを実行すると出力は以下のようになる。
生成されたXML文書は以下のようになる。
<?xml version="1.0"?>
<個人情報 xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.atmarkIT.co.jp/xmlns/sample/person">
<名前 xmlns="http://www.atmarkIT.co.jp/xmlns/sample/name">山田太郎</名前>
<年齢 xmlns="http://www.atmarkIT.co.jp/xmlns/sample/age">17</年齢>
</個人情報>
|
|
生成されたXML文書 |
ここで注目すべき点は、属性の名前付き引数として登場した「Namespace」である。これは、その属性が示す要素や属性に対して、名前空間URIを指定するために使われる。例えば、
XmlElement("名前", Namespace:="http://www.atmarkIT.co.jp/xmlns/sample/name")
という指定は、この属性が作るプロパティやフィールドを要素としてシリアライズし、要素名は「名前」、名前空間URIは「http://www.atmarkIT.co.jp/xmlns/sample/name」であることを指定している。名前付き引数Namespaceは、同様にXmlRoot属性にも付加することができる。
配列のシリアル化
クラスに配列が含まれていたら、シリアライズはどうなるのだろうか。以下は実際に配列を含むクラスをシリアライズさせてみた例である。
まずクラスの定義を見ていただこう。Personクラスと、そのクラスの配列を含むPersonsクラスを作成した。
Public Class Person
Private m_name As String = "未設定"
Private m_age As Integer = 0
Public Property Name() As String
Get
Return m_name
End Get
Set(ByVal Value As String)
m_name = Value
End Set
End Property
Public Property Age() As Integer
Get
Return m_age
End Get
Set(ByVal Value As Integer)
m_age = Value
End Set
End Property
End Class
Public Class Persons
Public persons(2) As Person
Public Sub SetPersons(ByVal person1 As Person, ByVal person2 As Person, ByVal person3 As Person)
persons(0) = person1
persons(1) = person2
persons(2) = 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
|
|
サンプル・プログラム5-1:配列を含んだクラス(VB.NET版/C#版) |
これらのクラスをシリアライズ、デシリアライズするサンプル・プログラムを以下に示す。Form1_Loadメソッドは、ほかの例と同じなので省略する。
Private Sub serializeSample()
Dim person1 As New Person
person1.Name = "山田太郎"
person1.Age = 17
Dim person2 As New Person
person2.Name = "山田二郎"
person2.Age = 16
Dim person3 As New Person
person3.Name = "山田三郎"
person3.Age = 15
Dim persons As New Persons
persons.SetPersons(person1, person2, person3)
Dim serializer As XmlSerializer = New XmlSerializer(GetType(Persons))
Dim stream As FileStream = New FileStream("c:\sample.xml", FileMode.Create)
Try
serializer.Serialize(stream, persons)
Finally
stream.Close()
End Try
End Sub
Private Sub deserializeSample()
Dim serializer As XmlSerializer = New XmlSerializer(GetType(Persons))
Dim persons As Persons
Dim stream As FileStream = New FileStream("c:\sample.xml", FileMode.Open)
Try
persons = CType(serializer.Deserialize(stream), Persons)
Finally
stream.Close()
End Try
persons.Dump()
End Sub
|
|
サンプル・プログラム5-2:配列を含むクラスをシリアライズ/デシリアライズするメソッド(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文書 |
この例では、ソース・コード上に目新しい記述はない。実際に実行した例を見ると、配列の中に入っているクラスもシリアライズされ、Personクラスの配列は、単純なPerson要素の繰り返しに置き換えられていることが分かるだろう。しかし、これだけでは、思い通りのXML文書を出力するには不十分である。例えば、この例では、Persons要素の子要素にpersons要素があり、その子要素にPerson要素があるため、少し不必要に要素の階層が深すぎる印象も受ける。
これらの問題に対処する方法は、次回に続く。乞うご期待である。
Insider.NET 記事ランキング
本日
月間