using System; using System.Collections.Generic; using System.Text; using System.Xml.Serialization; namespace DTS.DASLib.Service { /// /// This is a simple serializable dictionary /// I'm using it for storing user attributes on slicepro/1.5 right now, but it's probably suitable for any dictionary /// that needs to be serialized /// /// /// [XmlRoot("SerializedDictionary")] public class SerializableDictionary : Dictionary, IXmlSerializable { #region IXmlSerializable Members public System.Xml.Schema.XmlSchema GetSchema() { return null; } public void ReadXml(System.Xml.XmlReader reader) { XmlSerializer keySerializer = new XmlSerializer(typeof(TKey)); XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue)); bool wasEmpty = reader.IsEmptyElement; if (wasEmpty) return; reader.Read();//document reader.ReadStartElement();//serializeddictionary while (reader.NodeType != System.Xml.XmlNodeType.EndElement && reader.NodeType != System.Xml.XmlNodeType.None) { reader.ReadStartElement("Item"); reader.ReadStartElement("Key"); TKey key = (TKey)keySerializer.Deserialize(reader); reader.ReadEndElement(); reader.ReadStartElement("Value"); TValue value = (TValue)valueSerializer.Deserialize(reader); reader.ReadEndElement(); this.Add(key, value); reader.ReadEndElement(); reader.MoveToContent(); } if (reader.NodeType != System.Xml.XmlNodeType.None) { reader.ReadEndElement(); } } public void WriteXml(System.Xml.XmlWriter writer) { writer.WriteStartDocument(); XmlSerializer keySerializer = new XmlSerializer(typeof(TKey)); XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue)); writer.WriteStartElement("SerializedDictionary"); foreach (TKey key in this.Keys) { writer.WriteStartElement("Item"); writer.WriteStartElement("Key"); keySerializer.Serialize(writer, key); writer.WriteEndElement();//key writer.WriteStartElement("Value"); TValue value = this[key]; valueSerializer.Serialize(writer, value); writer.WriteEndElement();//value writer.WriteEndElement();//item writer.Flush(); } writer.WriteEndElement();//SerializedDictionary writer.WriteEndDocument(); } #endregion } }