連載

.NETで簡単XML

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

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

Back Issue
1
XML超入門
2 プログラムでXML文書を作成する
3 XML文書を読み書きするプログラムの作成
4 DOM(Document Object Model)

5

DOMとXPath

6

.NETプログラムでXSLTスクリプトを使う

7

VS.NETでXML Schemaを活用する(作成編)
8 VS.NETでXML Schemaを活用する(動作編)
9 オブジェクトをXMLでシリアライズ(1)

今回のサンプル・プログラムについて

 今回もサンプル・プログラムは、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#版

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

山田太郎
17

 生成された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である。


 INDEX
  .NETで簡単XML
  第10回 オブジェクトをXMLでシリアライズ(2)
  1.要素名を指定してシリアライズする
    2.属性の指定/参照されるオブジェクトのシリアル化
    3.名前空間の指定/配列のシリアル化
 
インデックス・ページヘ  「連載 :.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 記事ランキング

本日 月間