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

More than 5 years have passed since last update.

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";
}



参考