連載

.NETで簡単XML

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

株式会社ピーデー 川俣 晶
2003/10/15
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を活用する(動作編)

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

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

オブジェクトの永続化

 純粋なオブジェクト指向の世界とは、あらゆる情報がオブジェクトとしてモデリングされ、クラスとして記述される。プログラムとは、クラスの集まりであり、クラスから生成される多数のインスタンスが情報の実体を持つことになる。しかし、この方法には重大な問題がある。それは、通常インスタンスはメモリ上に生成されるものであり、プログラムを終了すると消えてしまうということである。どんなに素晴らしい情報を持ったインスタンスを生成したとしても、プログラムが終了すると消えてなくなるのはうれしいことではない。そこで必要とされるのが、「永続化」という機能である。永続化とは、インスタンスの内容をファイルなどに保存することによって、プログラムが終了してもインスタンスの内容を生き延びさせる機能である。そしてそれが再び必要とされたとき、インスタンスの内容を読み取って復活させることができる。

 このような永続化によく使われる機能として「シリアライズ」と呼ばれるものがある(「シリアル化」とも呼ばれる)。これは、インスタンスの内容を一列のデータの列に置き換える処理である。複雑な構造のデータであっても、直線的な一列のデータに置き換えることができれば、ファイルに保存したり、通信回線で送ったりが容易になる。また、この一列のデータを復元することを「デシリアライズ」という(「逆シリアル化」とも呼ばれる)。シリアライズとデシリアライズの機能は、多くのオブジェクト指向関係のシステムで用意されている標準的な機能といえる。その点で、.NET Frameworkも例外ではない。

 次の問題は、どのようなフォーマットにシリアライズするかである。直線的な一列のデータに置き換えるといっても、それを具体的に表現する方法は1つではない。まったく独自のバイナリ・データとして書き込む方法もあるし、何らかの標準化されたテキスト・データとして書き込む方法もある。速度や容量の点からいえば、独自のバイナリ形式でシリアライズしてしまうのが最善だが、このような方法を使うと、特定のシステムでしか読み書きできないデータが出力されてしまう。ただ単に、あるプロセスが終了してから次に起動されるまでの間だけ内容を保持するならこれでもよいが、シリアライズした内容を別のシステムに送信して、そこで処理を継続するような使い方も想定すると、これでは不十分である。つまり、相互に互換性のないシステム間で、シリアライズしたデータをやり取りする可能性があるということである。そのような使い方を考えると、標準化されたテキスト・データを使う価値が見えてくるだろう。また、システムのメンテナンス性などを考えれば、分かりやすいテキスト・データとしてシリアライズすることは価値があるといえる。

 そのような観点から世の中を見ると、XMLという格好の材料があることが分かるだろう。XMLの登場以来、シリアライズのフォーマットとしてXMLを使うということがよく行われるようになった。.NET Frameworkもその例外ではなく、XMLによるシリアライズを行うXmlSerializerクラス(System.Xml.Serialization名前空間)を含んでいる。今回はこのクラスを使って、オブジェクトをシリアライズして永続化するプログラミングを解説したいと考えている。

 なお、.NET Frameworkに含まれるシリアライズの機能は、XmlSerializerクラスだけではない。もう1つ、Serializable属性を用いる方法がある。この機能の内容と、今回解説する機能との相違も、この連載の中で触れる予定である。

最もシンプルなシリアライズ

 さっそく、XmlSerializerクラスを使用して、シリアライズを行う例を見てみよう。このサンプル・プログラムでは、「Person」というクラスを作成し、それをシリアライズしてファイルに書き込み、それを読み込んで内容を出力するコードを作成している。Personクラスと、シリアライズを行うコードは直接関係を持たないので、別個に掲載しよう。まず、Personクラスは以下のように記述した。

Public Class Person
  Private m_name As String = "未設定"
  Private m_address As String = "未設定"
  Public 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 ReadOnly Property Address() As String
    Get
      Return m_address
    End Get
  End Property

  Public Sub SetTemporaryID(ByVal temporaryID As String)
    m_temporaryID = temporaryID
  End Sub

  Public Sub Dump()
    Trace.WriteLine(m_name)
    Trace.WriteLine(m_address)
    Trace.WriteLine(Age)
    Trace.WriteLine(m_temporaryID)
  End Sub
End Class
サンプル・プログラム1-1:Personクラス(VB.NET版C#版

 このクラスは特殊な機能などは使用していないので、特に解説を行う必要はないだろう。


 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 記事ランキング

本日 月間