C# で XML の シリアライズ と デシリアライズ

0 件のコメント

正直、今更感はありますが… C# を用いて、XMLファイル を読み込んで オブジェクト を生成する デシリアライズ と、 オブジェクト を XMLファイル へ書き込む シリアライズ を行うサンプルコード を覚書きしておきます。

目次

概要(オブジェクトを読み書きするサンプルコード)

この記事の目標は、次に示す サンプルコード のような読み書きができる仕組み(コード)を作ることです。

目標とする読み書きのサンプルコード

namespace Sample
{
    public class Main
    {
        public static void Main()
        {
            // ファイルからオブジェクトを読み込み(デシリアライズ)
            var config = XmlUtility.LoadFromFile<Config>("config.xml");

            // ファイルへオブジェクトを保存(シリアライズ)
            XmlUtility.SaveToFile("config.xml", config, typeof(Config));
        }
    }
}

上記のような コード で XML と オブジェクト をやり取りするためには、以下の2つを作成する必要があります。

以下で、それぞれについて詳細を見ていきます。

シリアライズ、デシリアライズ 処理

ここでは「XMLファイル と オブジェクト の間でやり取りをする仕組み」を実装します。

XmlUtility.cs

namespace Sample
{
    using System;
    using System.IO;
    using System.Xml;
    using System.Xml.Serialization;

    /// 
    /// XMLファイルの読み書きを補助する機能を提供します。
    /// 
    public class XmlUtility
    {
        /// 
        /// XMLファイルからシリアライズ可能なオブジェクトを読み込みます。
        /// 
        /// 読み込むオブジェクトの型
        /// オブジェクトが保存されたXMLファイルパス
        /// デシリアライズされたオブジェクト
        public static T LoadFromFile<T>(string filePath)
            where T : class
        {
            T obj = null;
            var serializer = new XmlSerializer(typeof(T));

            // ファイルが存在するときだけ実行可能
            if (!File.Exists(filePath))
            {
                throw new FileNotFoundException();
            }

            // ファイルからオブジェクトの読み込み(デシリアライズ)
            using (var fs = new FileStream(filePath, FileMode.Open))
            {
                obj = serializer.Deserialize(fs) as T;
            }

            return obj;
        }

        /// 
        /// シリアライズ可能なオブジェクトをXMLファイルへ書き込みます。
        /// 
        /// 書き込むXMLファイルパス
        /// シリアライズするオブジェクト
        /// シリアライズするオブジェクトの型
        public static void SaveToFile(string filePath, object obj, Type type)
        {
            var serializer = new XmlSerializer(type);
            
            // 書き込む書式の設定
            var settings = new XmlWriterSettings();
            settings.OmitXmlDeclaration = false;

            // ファイルへオブジェクトを書き込み(シリアライズ)
            using (var writer = XmlWriter.Create(filePath, settings))
            {
                serializer.Serialize(writer, obj);
            }
        }
    }
}

読み書きする オブジェクト

ここでは「XMLファイル と オブジェクト の間でやり取りをするルール」を実装します。

Config.cs

namespace Sample
{
    using System;
    using System.Xml.Serialization;

    [Serializable]
    [XmlRoot("config")]
    public class Config
    {
        [XmlIgnore]
        public DateTime TimeStamp { get; set; }

        [XmlAttribute("id")]
        public string Id { get; set; }

        [XmlElement("server")]
        public string ServerName { get; set; }
    }
}

属性を設定することで、XMLファイル に対してどのように出力するかを設定できます。 これらをうまく設定、構成することで、任意のオブジェクトやXMLファイルを構成していきます。

XmlRoot
ルート要素として XMLファイル へ出力
XmlIgnore
XMLファイル へ出力しない
XmlAttribute
属性として XMLファイル へ出力
XmlElement
要素として XMLファイル へ出力

今回、以下のサイトを参考にしました。