|
|
連載
.NETで簡単XML
第10回 オブジェクトをXMLでシリアライズ(2)
株式会社ピーデー 川俣 晶
2003/10/29 |
|
今回のサンプル・プログラムについて
今回もサンプル・プログラムは、Visual Basic .NET(以下VB.NET)とC#で記述したものを用意した。VB.NETのサンプルを掲載するとともに、VB.NET、C#それぞれへのサンプルのリンクを張ってあるので、必要に応じてダウンロードしてほしい。開発環境としてはVisual Studio.NET 2003を使用することを前提にしている。
サンプル・プログラムはすべてWindowsアプリケーションとしてプロジェクトを作成後に、フォームのLoadイベントに実行するコードを書き込み、Trace.WriteLineメソッドで結果を出力する。結果の確認は、統合開発環境(IDE)の出力ウィンドウで行う。ただし、クラスだけはフォームのクラス外に別途記述する必要がある。それぞれのソースの先頭には、以下のコードが書かれているものとする。
Imports System.IO
Imports System.Xml.Serialization
|
|
VB.NETの場合 |
using System.IO;
using System.Xml.Serialization;
|
|
C#の場合 |
要素名の指定
前回紹介した例では、シリアライズを行う際の要素名は、クラス名やフィールド名がそのまま使われていた。単純に1つのプログラム内でシリアライズしてデシリアライズするだけなら、どのような名前でも構わないのだが、シリアライズした結果を別のシステムでデシリアライズするとなると、特定の名前が強制される可能性が出てくる。強制された名前がそのままソース・コードに書き込めればよいのだが、組織ごとの命名規則やそのほかの理由でそうもいかない場合も出てくるだろう。例えば、.NET Frameworkの世界では、パブリックなフィールドやプロパティは先頭のアルファベットを大文字にするのが普通だが、要素名として先頭が小文字であることを要求されることも考えられるだろう。そのような場合には、それぞれのフィールドやプロパティを出力する際に使用する要素名を指定することで対処できる。
次に示すのは、その指定を行ったPersonクラスである。
<XmlRoot("個人情報")> Public Class Person
Private m_name As String = "未設定"
Private m_age As Integer = 0
<XmlElement("名前")> Public Property Name() As String
Get
Return m_name
End Get
Set(ByVal Value As String)
m_name = Value
End Set
End Property
<XmlElement("年齢")> 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
|
|
サンプル・プログラム1-1:Personクラス(VB.NET版/C#版) |
続いて、このクラスをシリアライズ/デシリアライズするserializeSampleメソッドと、deserializeSampleメソッドを示す。
Private Sub serializeSample()
Dim person As Person = New Person
person.Name = "山田太郎"
person.Age = 17
person.TemporaryID = DateTime.Now.ToString()
Dim serializer As XmlSerializer = New XmlSerializer(GetType(Person))
Dim stream As FileStream = New FileStream("c:\sample.xml", FileMode.Create)
Try
serializer.Serialize(stream, person)
Finally
stream.Close()
End Try
End Sub
Private Sub deserializeSample()
Dim serializer As XmlSerializer = New XmlSerializer(GetType(Person))
Dim person As Person
Dim stream As FileStream = New FileStream("c:\sample.xml", FileMode.Open)
Try
person = CType(serializer.Deserialize(stream), Person)
Finally
stream.Close()
End Try
person.Dump()
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
serializeSample()
deserializeSample()
End Sub
|
|
サンプル・プログラム1-2:シリアライズ/デシリアライズを行うメソッド(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">
<名前>山田太郎</名前>
<年齢>17</年齢>
</個人情報>
|
|
生成されたXML文書 |
ここで注目すべき点は、クラスに付加されたXmlRoot属性と、フィールドに付加されたXmlElement属性である。XmlRoot属性は、出力されるXML文書のルート要素の情報を指定する。コンストラクタの引数に名前を指定することで、その名前がルート要素の名前になる。ここでは、XmlRoot("個人情報")としているが、実際にXML文書のルート要素が「個人情報」という名前になっていることが分かるだろう。XmlElement属性はフィールドやプロパティが要素として出力されるべきことを指定する属性である。もちろんこの属性を書かなくても、前回ですでに見たように要素として出力される。しかし、属性の引数に指定する名前が要素名になるという機能を使うためには、この属性を指定する必要がある。
なお、XmlElementというクラス(System.Xml.XmlElement)が存在することに注意が必要である。ここでいうXmlElement属性は、XmlElementAttributeクラス(System.Xml.Serialization名前空間)を意味する。属性として使用する場合は名前の末尾の「Attribute」を省略表記できるのでXmlElementと表記しているが、真の名前はXmlElementAttributeである。
Insider.NET 記事ランキング
本日
月間