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

0 件のコメント

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

目次

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
namespace Sample
{
    using System;
    using System.IO;
    using System.Xml;
    using System.Xml.Serialization;
 
    /// <summary>
    /// XMLファイルの読み書きを補助する機能を提供します。
    /// </summary>
    public class XmlUtility
    {
        /// <summary>
        /// XMLファイルからシリアライズ可能なオブジェクトを読み込みます。
        /// </summary>
        /// <typeparam name="T">読み込むオブジェクトの型</typeparam>
        /// <param name="filePath">オブジェクトが保存されたXMLファイルパス
        /// <returns>デシリアライズされたオブジェクト</returns>
        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;
        }
 
        /// <summary>
        /// シリアライズ可能なオブジェクトをXMLファイルへ書き込みます。
        /// </summary>
        /// <param name="filePath">書き込むXMLファイルパス
        /// <param name="obj">シリアライズするオブジェクト
        /// <param name="type">シリアライズするオブジェクトの型
        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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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ファイル へ出力

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

最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!