連載

.NETで簡単XML

第9回 オブジェクトをXMLでシリアライズ(1)

株式会社ピーデー 川俣 晶
2003/10/15
Page1 Page2 Page3

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

 これを実行すると出力は以下のようになる。

山田太郎
17
未設定

 生成された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で要素名や属性、名前空間を指定する方法、クラスに別のクラスへの参照が含まれる場合や配列が含まれる場合のシリアライズなど、シリアライズについてより詳しく掘り下げていく。End of Article


 INDEX
  .NETで簡単XML
  第9回 オブジェクトをXMLでシリアライズ(1)
    1.シリアライズによるオブジェクトの永続化
    2.シリアライズ/デシリアライズを行う例
  3..XmlIgnoreAttribute属性を使用したシリアル化の防止
 
インデックス・ページヘ  「連載 :.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 記事ランキング

本日 月間