using System.Xml.Serialization; using System.Collections.Generic; using System.Xml; using System.IO; using System; public class DictionarySerializer { public struct SerializableKeyValuePair { public TKey Key; public TValue Value; public SerializableKeyValuePair(KeyValuePair kvp) { this.Key = kvp.Key; this.Value = kvp.Value; } } private XmlSerializer Serializer = new XmlSerializer(typeof(List>)); public void Serialize(Dictionary dictionary, XmlWriter serializationStream) { Serializer.Serialize(serializationStream, BuildItemList(dictionary)); } public void Serialize(Dictionary dictionary, TextWriter serializationStream) { Serializer.Serialize(serializationStream, BuildItemList(dictionary)); } public void Serialize(Dictionary dictionary, Stream serializationStream) { Serializer.Serialize(serializationStream, BuildItemList(dictionary)); } private List> BuildItemList(Dictionary dictionary) { List> list = new List>(); foreach (KeyValuePair nonSerializableKVP in dictionary) { list.Add(new SerializableKeyValuePair(nonSerializableKVP)); } return list; } public Dictionary Deserialize(XmlReader serializationStream) { List> dictionaryItems = Serializer.Deserialize(serializationStream) as List>; return BuildDictionary(dictionaryItems); } public Dictionary Deserialize(TextReader serializationStream) { List> dictionaryItems = Serializer.Deserialize(serializationStream) as List>; return BuildDictionary(dictionaryItems); } public Dictionary Deserialize(Stream serializationStream) { List> dictionaryItems = Serializer.Deserialize(serializationStream) as List>; return BuildDictionary(dictionaryItems); } private Dictionary BuildDictionary(List> dictionaryItems) { Dictionary dictionary = new Dictionary(dictionaryItems.Count); foreach (SerializableKeyValuePair item in dictionaryItems) { dictionary.Add(item.Key, item.Value); } return dictionary; } }