The Dictionary class included in C# isn’t serializable, so you can use the following Serializable Dictionary whenever you need to serialize your objects
[Serializable] public class SerializableDictionary : Dictionary, IXmlSerializable, ISerializable { #region Private Properties protected XmlSerializer ValueSerializer { get { return _valueSerializer ?? (_valueSerializer = new XmlSerializer(typeof(TVal))); } } private XmlSerializer KeySerializer { get { return _keySerializer ?? (_keySerializer = new XmlSerializer(typeof(TKey)));} } #endregion #region Private Members private XmlSerializer _keySerializer; private XmlSerializer _valueSerializer; #endregion #region Constructors public SerializableDictionary() { } public SerializableDictionary(IDictionary dictionary) : base(dictionary) { } public SerializableDictionary(IEqualityComparer comparer) : base(comparer) { } public SerializableDictionary(int capacity) : base(capacity) { } public SerializableDictionary(IDictionary dictionary, IEqualityComparer comparer) : base(dictionary, comparer) { } public SerializableDictionary(int capacity, IEqualityComparer comparer) : base(capacity, comparer) { } #endregion #region ISerializable Members protected SerializableDictionary(SerializationInfo info, StreamingContext context) { int itemCount = info.GetInt32("itemsCount"); for (int i = 0; i < itemCount; i++) { KeyValuePair kvp = (KeyValuePair)info.GetValue(String.Format(CultureInfo.InvariantCulture, "Item{0}", i), typeof(KeyValuePair)); Add(kvp.Key, kvp.Value); } } void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue("itemsCount", Count); int itemIdx = 0; foreach (KeyValuePair kvp in this) { info.AddValue(String.Format(CultureInfo.InvariantCulture, "Item{0}", itemIdx), kvp, typeof(KeyValuePair)); itemIdx++; } } #endregion #region IXmlSerializable Members void IXmlSerializable.WriteXml(XmlWriter writer) { foreach (KeyValuePair kvp in this) { writer.WriteStartElement("item"); writer.WriteStartElement("key"); KeySerializer.Serialize(writer, kvp.Key); writer.WriteEndElement(); writer.WriteStartElement("value"); ValueSerializer.Serialize(writer, kvp.Value); writer.WriteEndElement(); writer.WriteEndElement(); } } void IXmlSerializable.ReadXml(XmlReader reader) { if (reader.IsEmptyElement) { return; } // Move past container if (reader.NodeType == XmlNodeType.Element && !reader.Read()) throw new XmlException("Error in De serialization of SerializableDictionary"); while (reader.NodeType != XmlNodeType.EndElement) { reader.ReadStartElement("item"); reader.ReadStartElement("key"); TKey key = (TKey)KeySerializer.Deserialize(reader); reader.ReadEndElement(); reader.ReadStartElement("value"); TVal value = (TVal)ValueSerializer.Deserialize(reader); reader.ReadEndElement(); reader.ReadEndElement(); Add(key, value); reader.MoveToContent(); } // Move past container if (reader.NodeType == XmlNodeType.EndElement) { reader.ReadEndElement(); } else { throw new XmlException("Error in Deserialization of SerializableDictionary"); } } System.Xml.Schema.XmlSchema IXmlSerializable.GetSchema() { return null; } #endregion }
Quick Links
Legal Stuff