C# Dictionaryをシリアル・逆シリアル化(XML変換)する方法

C# Dictionaryシリアル化

今回は、C#でDictionaryをシリアル・逆シリアル化(XML変換)する方法を解説していきます。

目次
スポンサーリンク

Dictionaryをシリアル化するクラス

まずは、Dictionaryをシリアル化するクラスを作成しました。

fileNameにXMLファイルを指定することでシリアル化されます。

/// <summary>
/// シリアル化(オブジェクト→XML変換)
/// </summary>
static void Serialize()
{
    // 保存先のファイル名
    string fileName = Path.Combine(Directory.GetCurrentDirectory(), "sample.xml");

    // 保存するクラス(TestClass)のインスタンスを作成
    TestClass obj = new TestClass();

    // DataContractSerializerオブジェクトを作成
    // オブジェクトの型を指定する
    DataContractSerializer serializer = new DataContractSerializer(typeof(TestClass));
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Encoding = new System.Text.UTF8Encoding(false);
    XmlWriter xw = XmlWriter.Create(fileName, settings);

    // シリアル化し、XMLファイルに保存する
    serializer.WriteObject(xw, obj);

    // ファイルを閉じる
    xw.Close();
}

逆シリアル化するクラス

逆シリアル化は以下のクラスからできます。

/// <summary>
/// 逆シリアル化(XML→オブジェクト変換)
/// </summary>
static void Deserialize()
{
    // 保存先のファイル名
    string fileName = Path.Combine(Directory.GetCurrentDirectory(), "sample.xml");

    // DataContractSerializerオブジェクトを作成
    DataContractSerializer serializer = new DataContractSerializer(typeof(TestClass));
    // 読み込むファイルを開く
    XmlReader xr = XmlReader.Create(fileName);
    // XMLファイルから読み込み、逆シリアル化する
    TestClass obj = (TestClass)serializer.ReadObject(xr);
    // ファイルを閉じる
    xr.Close();
}

Dictionaryをシリアル・逆シリアル化してみた

サンプルコード

using System.IO;
using System.Runtime.Serialization;
using System.Xml;


namespace DictionaryToXmlSmaple
{
    /// <summary>
    /// XMLファイルに保存するオブジェクトのためのクラス
    /// </summary>
    [DataContract]
    public class TestClass
    {
        [DataMember]
        public int Number;
        // DataMemberAttributeが無いのでシリアル化されない
        public string Name;
        // プライベートでもDataMemberAttributeがあればシリアル化される
        [DataMember]
        private string Age;

        // コンストラクタ
        public TestClass()
        {
            this.Number = 10;
            this.Name = "ほげほげ先輩";
            this.Age = "99歳";
        }

        // コンストラクタ
        public TestClass(int num, string name, string age)
        {
            this.Number = num;
            this.Name = name;
            this.Age = age;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // シリアル化(オブジェクト→XML変換)
            Serialize();

            // 逆シリアル化(XML→オブジェクト変換)
            Deserialize();
        }

        /// <summary>
        /// シリアル化(オブジェクト→XML変換)
        /// </summary>
        static void Serialize()
        {
            // 保存先のファイル名
            string fileName = Path.Combine(Directory.GetCurrentDirectory(), "sample.xml");

            // 保存するクラス(TestClass)のインスタンスを作成
            TestClass obj = new TestClass();

            // DataContractSerializerオブジェクトを作成
            // オブジェクトの型を指定する
            DataContractSerializer serializer = new DataContractSerializer(typeof(TestClass));
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Encoding = new System.Text.UTF8Encoding(false);
            XmlWriter xw = XmlWriter.Create(fileName, settings);

            // シリアル化し、XMLファイルに保存する
            serializer.WriteObject(xw, obj);

            // ファイルを閉じる
            xw.Close();
        }

        /// <summary>
        /// 逆シリアル化(XML→オブジェクト変換)
        /// </summary>
        static void Deserialize()
        {
            // 保存先のファイル名
            string fileName = Path.Combine(Directory.GetCurrentDirectory(), "sample.xml");

            // DataContractSerializerオブジェクトを作成
            DataContractSerializer serializer = new DataContractSerializer(typeof(TestClass));
            // 読み込むファイルを開く
            XmlReader xr = XmlReader.Create(fileName);
            // XMLファイルから読み込み、逆シリアル化する
            TestClass obj = (TestClass)serializer.ReadObject(xr);
            // ファイルを閉じる
            xr.Close();
        }
    }
}

実行結果

<?xml version="1.0" encoding="UTF-8"?>
<TestClass xmlns="http://schemas.datacontract.org/2004/07/DictionaryToXmlSmaple" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
 <Age>99歳</Age>
 <Number>10</Number>
</TestClass>

DataMemberAttributeを付けていないNameは出力されません。

逆シリアル化したデータはobjに保存されます。

Formアプリでコマンドライン引数を読み込みたい場合はどうすればいい?

FormアプリだとMain関数の引数がないので、明示的にコマンドライン引数を読み込む必要があります。

具体的にはSystem.Environment.CommandLine、あるいはSystem.Environment.GetCommandLineArgs()を使うことでコマンドライン引数を読み込むことができます。

サンプルコード

//コマンドライン引数を表示する
Console.WriteLine(System.Environment.CommandLine);

//コマンドライン引数を配列で取得する
string[] cmds = System.Environment.GetCommandLineArgs();
//コマンドライン引数を列挙する
foreach (string cmd in cmds)
{
    Console.WriteLine(cmd);
}

実行結果

起動引数に /a /b "/c /d"と割り当てた場合は以下のように表示されます。

/a
/b
/c /d
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

都内の精密機器を作っている会社に勤務している14年目のエンジニアです。趣味は美味しいものを食べることとゴルフ。プログラムについて今まで学んだことをわかりやすく発信するサイトを目指しています。

コメント

コメントする

目次