XMLシリアル化を使用することで、オブジェクトのファイルへの書き込み、読み込みを容易に行えます。
オブジェクトをストリームに変換し、ファイルへ書き込みます。
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>
ファイルをストリームから読み込み、オブジェクトに変換します。
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の形式を変更できます。
| 属性 | 機能 | 適用前 | 適用後 |
|---|---|---|---|
| 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形式によるXmlSerializer以外にもSOAP形式のSoapFormatterもあります。しかし.NET Framework 3.5以降では、このクラスの使用が推奨されていません。よってXmlSerializerか、もしくはバイナリ形式のBinaryFormatterを使用するようにします。