[ C# ] XML シリアライズ – 文字列と Enum の関連付け ( XmlEnum )

Pocket

ここでは、XML データをクラスオブジェクトに逆シリアル化するときに、XML のテキストデータを C# の Enum と関連付けるサンプルコードを掲載しています。

スポンサーリンク

XML ファイル

ここでは、次の簡易な XML データを使用します。

<?xml version="1.0" encoding="utf-8"?>
<Test>
  <CharSet>UTF8</CharSet>
</Test>

関連付けるクラス定義

XML データを格納するクラス定義は次のとおりです。Enum 定義もあわせて確認しましょう。XmlEnum アノテーションで定義されている文字列が XML ファイルに定義される文字列に対応しています。

XML ファイルでは文字列として人がわかりやすい形式で保存することができ、プログラマ側は意味不明な数値ではなく、意味のわかりやすい Enum を使用することができる点が利点だと思います。

C#

    public enum CharSetType
    {
        [XmlEnum("UTF8")]
        UTF8,
        [XmlEnum("ShiftJIS")]
        ShiftJIS
    }

    [XmlRoot("Test")]
    public class XmlData
    {
        [XmlElement("CharSet")]
        public CharSetType CharSet { get; set; }

        public XmlData()
        {
            // コンストラクタでの初期化
            CharSet = CharSetType.ShiftJIS;
        }
    }

この XmlEnum アノテーションの定義によって、 CharSet タグに Enum 定義した値以外の値が入っているデータの逆シリアル化は全て例外が発生しエラーとなります。空文字列の場合でも例外となります。

例えば、CharSet タグの値が UTF16 であるときには、以下の例外が発生します。

System.InvalidOperationException
{“インスタンス検証エラー : ‘UTF16’ は CharSetType の有効な値ではありません。”}

逆シリアル化とシリアル化のサンプル

次は、実際に逆シリアル化とシリアル化を行うサンプルプログラムになります。詳細はコメントを参照ください。

C#

    XmlData xdata = null;
    using (FileStream fs = new FileStream(@"d:\test.xml", FileMode.Open))
    {
        // デシリアライズ
        // XMLファイルのデータをクラスオブジェクトに対応する読み込む
        XmlSerializer serializer = new XmlSerializer(typeof(XmlData));
        xdata = (XmlData)serializer.Deserialize(fs);
    }

    Console.WriteLine(xdata.CharSet); // UTF8

    // シリアライズ
    using (StreamWriter sw = new StreamWriter(@"d:\test2.xml", false, Encoding.UTF8))
    {
        // 値を設定
        xdata.CharSet = CharSetType.ShiftJIS;

        // 名前空間は出力しない
        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
        ns.Add(String.Empty, String.Empty);

        // シリアライズ
        // クラスオブジェクトのデータをXMLファイルとして出力
        XmlSerializer serializer = new XmlSerializer(typeof(XmlData));
        serializer.Serialize(sw, xdata, ns);
    }

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *