動作確認環境: .NET Framework 2.0, Visual Studio 2005

更新日: 2010 年 2 月 12 日


.NET Framework で用いられている様々な Serialization から、XML 形式の Serializer (XmlSerializer) を利用する方法をご紹介したいと思います。

例えば姓と名を保持するクラスがあるとします。XmlSerializer を用いることでこのデータを XML 表現に置き換えることができます。

C#
using System;
using System.Text;
using System.IO;
using System.Xml.Serialization;

public class Person
{
    public Person() { }

    public Person(string firstName, string lastName)
    {
        FirstName = firstName;
        LastName = lastName;
    }

    public string FirstName { get; set; }
    public string LastName { get; set; }
}

class Program
{
    static void Main()
    {
        var serializer = new XmlSerializer(typeof(Person));
        var ms = new MemoryStream();

        serializer.Serialize(ms, new Person("山田", "太郎"));
        var xml = Encoding.UTF8.GetString(ms.ToArray());
        Console.WriteLine(xml);
    }
}
 

クラスの場合、デフォルト コンストラクターが必要となることに注意してください。

コンソール アプリケーションでこのコードを実行すると、

C#
<?xml version="1.0"?>
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <FirstName>山田</FirstName>
  <LastName>太郎</LastName>
</Person>
 

と表示されます。

自動的にクラス名、プロパティ名が設定されていることがわかると思います。出力される XML の形を厳密に定義してみましょう。

C#
[XmlType("名前")]
public class Person
{
    public Person() { }

    public Person(string firstName, string lastName)
    {
        FirstName = firstName;
        LastName = lastName;
    }

    [XmlElement("姓")]
    public string FirstName { get; set; }
    [XmlElement("名")]
    public string LastName { get; set; }
}
 

このように指定すると、出力結果は

C#
<?xml version="1.0"?>
<名前 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <姓>山田</姓>
  <名>太郎</名>
</名前>
 

となります。他にも、XmlElement 属性を XmlAttribute 属性に変更すると

C#
<?xml version="1.0"?>
<名前 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 姓="山田" 名="太郎" />
 

と、要素ではなく属性として Serialize されます。

この XML を Deserialize するには、XmlSerializer.Deserialize() を利用します。

C#
using System;
using System.Text;
using System.IO;
using System.Xml.Serialization;

public class Person
{
    public Person() { }

    public Person(string firstName, string lastName)
    {
        FirstName = firstName;
        LastName = lastName;
    }

    public string FirstName { get; set; }
    public string LastName { get; set; }
}

 class Program
{
    static void Main()
    {
        var serializer = new XmlSerializer(typeof(Person));
        var ms = new MemoryStream();

        serializer.Serialize(ms, new Person("山田", "太郎"));
        var xml = Encoding.UTF8.GetString(ms.ToArray());

        Console.WriteLine(xml);

        // 先頭に戻す
        ms.Seek(0, SeekOrigin.Begin);
        Person person = (Person)serializer.Deserialize(ms);

        Console.WriteLine("逆シリアル化されたオブジェクト");
        Console.WriteLine(person.FirstName);
        Console.WriteLine(person.LastName);
    }
}
 

このコードの実行結果は

C#
<?xml version="1.0"?>
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <FirstName>山田</FirstName>
  <LastName>太郎</LastName>
</Person>
逆シリアル化されたオブジェクト
山田
太郎
 

となります。XML 形式を利用することで柔軟なデータのやり取りが可能になります。

MSDN ライブラリにはさらに詳しい使用例が載っていますのでそちらもご参照ください。


Code Recipe Code Recipe

ページのトップへ