LoginSignup
10
13

More than 5 years have passed since last update.

Dictionaryをシリアル化する(XMLファイルに保存)

Last updated at Posted at 2012-12-26

Dictionaryをシリアル化するには、IXmlSerializable インターフェースを実装したクラスを作成します。

SerializableDictionary.cs.cs
// シリアル化可能な Dictionary クラス
public class SerializableDictionary<Tkey, TValue> : Dictionary<Tkey, TValue>, IXmlSerializable
{
    public System.Xml.Schema.XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(KeyValue));

        reader.Read();
        if (reader.IsEmptyElement)
            return;

        while (reader.NodeType != XmlNodeType.EndElement)
        {
            KeyValue kv = serializer.Deserialize(reader) as KeyValue;
            if (kv != null) 
                Add(kv.Key, kv.Value);
        }
        reader.Read();
    }

    public void WriteXml(XmlWriter writer)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(KeyValue));
        foreach (var key in Keys)
        {
            serializer.Serialize(writer, new KeyValue(key, this[key]));
        }
    }

    public class KeyValue
    {
        public KeyValue(Tkey key, TValue value)
        {
            Key = key;
            Value = value;
        }

        public Tkey Key { get; set; }
        public TValue Value { get; set; }
    }
}

シリアル化(オブジェクト→XMLファイル)

Serialize.cs
var selializer = new XmlSerializer(typeof(RecordInfo));
using (FileStream fs = new FileStream(GetXMLFilePath(), FileMode.Create))
{
    selializer.Serialize(fs, record);
}

逆シリアル化(XMLファイル→オブジェクト)

DeSerialize.cs
XmlSerializer serializer = new XmlSerializer(typeof(RecordInfo));
RecordInfo record2 = new RecordInfo();
using (FileStream fs = new FileStream(GetXMLFilePath(), FileMode.Open))
{
    record2 = serializer.Deserialize(fs) as RecordInfo;
    // XML からオブジェクトが復元されている
}

シリアライズ対象のクラスはこちら。

RecordInfo.cs
// これは私が必要だったので作ったクラス。作成する必要はない
public class RecordInfo: SerializableDictionary<string, FieldInfo>
{
}
FieldInfo.cs
public class FieldInfo
{
    public FieldInfo(string FieldName, string JapaneseFieldName)
    {
        this.FieldName = FieldName;
        this.JapaneseFieldName = JapaneseFieldName;
    }

    public string FieldName;
    public string JapaneseFieldName;
}

その他

Main.cs

private void Form1_Load(object sender, EventArgs e)
{
    record = new RecordInfo();

    record.Add("key1", new FieldInfo("key1", "キー1"));
    record.Add("key2", new FieldInfo("key2", "キー2"));
}

private string GetXMLFilePath()
{
    return @"d:\test.xml";
}

参考

10
13
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
13