XMLによるオブジェクトの保存と復元 - XMLシリアル化

XMLシリアル化を使用することで、オブジェクトのファイルへの書き込み、読み込みを容易に行えます。

シリアル化 (Serialize)

オブジェクトをストリームに変換し、ファイルへ書き込みます。

シリアル化の対象となるクラス

対象となるクラスの条件

  • publicである
  • publicな既定のコンストラクタを有する

対象となる要素の条件

  • publicなフィールド
  • get、setアクセサを有する publicなプロパティ

サポートされないオブジェクト

TimeSpan構造体はXmlSerializerによりサポートされないため、代替手段を講じる必要があります。Program It: XmlSerializer Doesn't Serialize TimeSpan to XML Duration Type

public class ClassName
{
    public  int publicField;   // publicなフィールド
    private int privateField;  // privateなフィールド (シリアル化の対象外)

    // get、setアクセサを有する publicなプロパティ
    public int Property
    {
        get { return privateField; }
        set { privateField = value; }
    }

    // getアクセサのみの publicなプロパティ (シリアル化の対象外)
    public int ReadOnliProperty
    {
        get { return privateField; }
    }

    // publicな既定のコンストラクタ
    public ClassName()
    {
    }
}

シリアル化の処理

class Program
{
    static void Main()
    {
        string fileName = "C:/sample.xml";

        ClassName foo = new ClassName();
        foo.publicField = 1;
        foo.Property    = 2;

        // シリアル化の対象となるクラスの型を指定して XmlSerializerを作成する
        using( System.IO.TextWriter writer = new System.IO.StreamWriter( fileName ) )
        {
            System.Xml.Serialization.XmlSerializer serializer
                = new System.Xml.Serialization.XmlSerializer( typeof( ClassName ) );

            // 指定のオブジェクトをシリアル化する
            serializer.Serialize( writer, foo );
        }
    }
}

次のようにXMLファイルが作成されます

<?xml version="1.0" encoding="utf-8"?>
<ClassName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <publicField>1</publicField>
  <Property>2</Property>
</ClassName>

逆シリアル化 (Deserialize)

ファイルをストリームから読み込み、オブジェクトに変換します。

class Program
{
    static void Main()
    {
        string fileName = "C:/sample.xml";
        ClassName foo;

        using( System.IO.TextReader reader = new System.IO.StreamReader( fileName ) )
        {
            System.Xml.Serialization.XmlSerializer serializer
                = new System.Xml.Serialization.XmlSerializer( typeof( ClassName ) );

            foo = ( ClassName )serializer.Deserialize( reader );
        }
    }
}

逆シリアル化を行うためには、TEMP環境変数により定義される一時フォルダに書き込むためのアクセス権限が必要です。

出力される XML形式のカスタマイズ

シリアル化の対象となるクラス自身やそのメンバに属性を付加することで、出力されるXMLの形式を変更できます。

属性 機能 適用前 適用後
XmlAttribute メンバをXMLの属性とする
<ClassName>
  <field>256</field>
</ClassName>
<ClassName field="256" />
XmlArray 配列の名前を変更する
<MemberName>
  <TypeName>
    <field>256</field>
  </TypeName>
</MemberName>
<OriginalName>
  <TypeName>
    <field>256</field>
  </TypeName>
</OriginalName>
XmlArrayItem 配列の要素名を、型名から任意の名前に変更する
<MemberName>
  <TypeName>
    <field>256</field>
  </TypeName>
</MemberName>
<MemberName>
  <OriginalName>
    <field>256</field>
  </TypeName>
</MemberName>
XMLシリアル化を制御する属性 - MSDN

SoapFormatterによる SOAP形式でのシリアル化

オブジェクトをシリアル化する方法には、XML形式によるXmlSerializer以外にもSOAP形式のSoapFormatterもあります。しかし.NET Framework 3.5以降では、このクラスの使用が推奨されていません。よってXmlSerializerか、もしくはバイナリ形式のBinaryFormatterを使用するようにします。