C# - よく使うクラス - System.Xml.Serialization

 クラウディア
1. 概要
2. XmlSerializer
3. XmlType 要素名を変更する

1. 概要

 語彙が少ないので、うまく説明できませんが、シリアライズ可能な変数をシリアライズします。  本ページは、下記にサイトを参考にさせていただきました。
オブジェクトの内容をXMLファイルに保存、復元する - .NET Tips (VB.NET,C#...)

2. XmlSerializer

 その名の通り、シリアライザなわけです。  うまく説明できないので、実例で。  下記のソースを書きます。

using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;

public class myXML
{
	[Serializable]
	public class classA
	{
		[Serializable]
		public class classB
		{
			public int 		c = 0;
			public string	d = String.Empty;
		}

		public List<classB> b = new List<classB>();
	}

    static public void Main ()
    {
		classA a = new classA();

		for (int i=0; i<2; i++)
		{
			for (int j=0; j<3; j++)
			{
				classA.classB b = new classA.classB();

				b.c =  (i*10) + j;
				b.d = ((i*10) + j).ToString();

				a.b.Add(b);
			}
		}

		FileStream fs = new FileStream(ファイル名, FileMode.Create, FileAccess.Write);
		using (fs)
		{
			XmlSerializer xmlserializer = new XmlSerializer(typeof(classA));
			xmlserializer.Serialize(fs, (object)a);
		}
    }
}
 ひとつめのミソは、8、11行の「[Serializable]」で、このクラスは、シリアライズ可能ですよと宣言しています。  で、41、42行で、編集したインスタンスを、その型でシリアライズして、ファイルに書き込むわけです。  実際に動かしてみました。  作成された「.xml」ファイルの中身は、下記のようになっています。

<?xml version="1.0"?>
<classA xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <b>
    <classB>
      <c>0</c>
      <d>0</d>
    </classB>
    <classB>
      <c>1</c>
      <d>1</d>
    </classB>
    <classB>
      <c>2</c>
      <d>2</d>
    </classB>
    <classB>
      <c>10</c>
      <d>10</d>
    </classB>
    <classB>
      <c>11</c>
      <d>11</d>
    </classB>
    <classB>
      <c>12</c>
      <d>12</d>
    </classB>
  </b>
</classA>

3. XmlType 要素名を変更する

 これもちょっと説明が難しいのですが・・・。  シリアライズするときに、内部にもつクラス名が、競合することがあります。  「C#」自体の文法としては、問題ないのですが、シリアライズするときに名前が競合すると例外が発生することがあります。  こういう際は、クラス名・変数名を「XmlType」を使って、「Xml」としては別のものとして出力します。  前項のクラス宣言の部分を下記のように変更しますと・・・。

	[Serializable]
	[System.Xml.Serialization.XmlType("Aだよん")]
	public class classA
	{
		[Serializable]
		[System.Xml.Serialization.XmlType("Bだよん")]
		public class classB
		{
			public int 		c = 0;
			public string	d = String.Empty;
		}

		public List<classB> b = new List<classB>();
	}
 出力結果は、下記のようになります。

<?xml version="1.0"?>
<_xFF21_だよん xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <b>
    <_xFF22_だよん>
      <c>0</c>
      <d>0</d>
    </_xFF22_だよん>
    <_xFF22_だよん>
      <c>1</c>
      <d>1</d>
    </_xFF22_だよん>
    <_xFF22_だよん>
      <c>2</c>
      <d>2</d>
    </_xFF22_だよん>
    <_xFF22_だよん>
      <c>10</c>
      <d>10</d>
    </_xFF22_だよん>
    <_xFF22_だよん>
      <c>11</c>
      <d>11</d>
    </_xFF22_だよん>
    <_xFF22_だよん>
      <c>12</c>
      <d>12</d>
    </_xFF22_だよん>
  </b>
</_xFF21_だよん>
 実は、全角文字もうまく表現してくれるかと思ったのですが、何故か「A」や「B」は、16進化した数字で表現されてしまいました。
earthcar(アースカー)
損保との違い