|
|
連載
.NETで簡単XML
第9回 オブジェクトをXMLでシリアライズ(1)
株式会社ピーデー 川俣 晶
2003/10/15 |
|
|
XmlIgnoreAttribute属性を使用したシリアル化の防止
クラスには、一時的に必要とされる情報を保持する変数というものが存在する場合がある。例えば、計算に時間が掛かるので、繰り返し何回も同じ計算をするのではなく、計算結果を保管しておいて活用しようというような場合である。そういう一時的な情報は、シリアライズで出力する必要がない。一時的にシステムから与えられるID番号などは、むしろ保存すべきではないとだろう。システムを再起動してからそのID番号を使おうとしても、システムはすでにその番号を発行したことを忘れているかもしれない。
そのような用途のために、シリアライズの対象から除外するという機能が必要とされる。以下はそれを使用した例である。前のサンプル・プログラムと同じように、クラスとそれを扱う部分を分けて掲載する。
まず、クラスから。
Public Class Person
Private m_name As String = "未設定"
Private m_age As Integer = 0
Private m_temporaryID As String = "未設定"
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
<XmlIgnoreAttribute()> Public Property TemporaryID() As String
Get
Return m_temporaryID
End Get
Set(ByVal Value As String)
m_temporaryID = Value
End Set
End Property
Public Sub Dump()
Trace.WriteLine(m_name)
Trace.WriteLine(m_age)
Trace.WriteLine(m_temporaryID)
End Sub
End Class
|
|
サンプル・プログラム2-1:Personクラス(VB.NET版/C#版) |
次のリストは、このクラスをシリアライズする部分である。デシリアライズとそれを呼び出すForm1_Loadメソッドは前のサンプル・プログラム1-2と同一なのでここでは省略している。
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
|
|
サンプル・プログラム2-2:シリアライズを行うメソッド(VB.NET版/C#版) |
これを実行すると出力は以下のようになる。
生成されたXML文書は以下のようになる。
<?xml version="1.0"?>
<Person xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Name>山田太郎</Name>
<Age>17</Age>
</Person>
|
|
生成されたXML文書 |
ここで注目すべき点は、PersonクラスのTemporaryIDプロパティに付加されたXmlIgnore属性である。この属性は、通常は何の効力も持たない。しかし、XmlSerializerクラスを用いてシリアライズとデシリアライズを行う場合は、対象となるプロパティまたはフィールドを対象外とするという効力を発揮する。これにより、TemporaryIDプロパティの値はXML文書に書き込まれず、デシリアライズした結果にも設定した値が出力されていないことが分かるだろう。
もう1つ、出力される要素の順番に注意して頂きたい。最初の例では、Age→Nameの順だが、この例ではName→Ageの順に出力されている。この違いはどこから来るものなのだろうか。これはソース・コード内での出現順に対応している。最初の例で、Age→Nameという順番になっていたのは、メンバ・フィールドのAgeのあとにプロパティNameが記述されていたという理由による。そして、この例でName→Ageの順に出力されているのは、プロパティNameのあとにプロパティAgeが記述されているという理由による。
以上、今回はシリアライズおよびデシリアライズについての基本的なコーディングについて解説した。次回では、出力されるXMLで要素名や属性、名前空間を指定する方法、クラスに別のクラスへの参照が含まれる場合や配列が含まれる場合のシリアライズなど、シリアライズについてより詳しく掘り下げていく。
Insider.NET 記事ランキング
本日
月間