System.Collections.DctionaryクラスはSrializable属性付いてるし、シリアライズできるよな……と思ったら出来なかったので対策を探したらすぐに発見。IXmlSerializable実装するだけでオッケーらしい。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
namespace XXXXXX
{
public class SerializableDictionary<T, U> : Dictionary<T, U>, IXmlSerializable
{
XmlSchema IXmlSerializable.GetSchema()
{
return null;
}
void IXmlSerializable.ReadXml(XmlReader reader)
{
XmlSerializer serializer = new XmlSerializer(typeof(KeyValueItem));
reader.ReadStartElement();
try
{
while (reader.NodeType != XmlNodeType.EndElement)
{
KeyValueItem item = (KeyValueItem)serializer.Deserialize(reader);
Add(item.Key, item.Value);
}
}
finally
{
reader.ReadEndElement();
}
}
void IXmlSerializable.WriteXml(XmlWriter writer)
{
var ns = new XmlSerializerNamespaces();
ns.Add(String.Empty, String.Empty);
XmlSerializer serializer = new XmlSerializer(typeof(KeyValueItem));
foreach (var key in Keys)
{
KeyValueItem item = new KeyValueItem();
item.Key = key;
item.Value = this[key];
serializer.Serialize(writer, item, ns);
}
}
[System.Xml.Serialization.XmlRoot("KeyValueItem")]
public class KeyValueItem
{
[System.Xml.Serialization.XmlElement("Key")]
public T Key;
[System.Xml.Serialization.XmlElement("Value")]
public U Value;
}
}
}