/////////////////////////////////////////////////////////////////////////// // Copyright (C) Wizardry and Steamworks 2013 - License: GNU GPLv3 // // Please see: http://www.gnu.org/licenses/gpl.html for legal details, // // rights of fair usage, the disclaimer and warranty conditions. // /////////////////////////////////////////////////////////////////////////// using System; using System.Collections.Generic; using System.IO; using System.Xml; using System.Xml.Schema; using System.Xml.Serialization; namespace wasSharp.Collections.Generic { /// /// A serializable dictionary class. /// /// the key /// the value public class SerializableDictionary : Dictionary, IXmlSerializable { public XmlSchema GetSchema() { return null; } public void ReadXml(XmlReader reader) { if (reader.IsEmptyElement) { return; } reader.ReadStartElement(); while (!reader.NodeType.Equals(XmlNodeType.EndElement)) { reader.ReadStartElement(ItemNodeName); reader.ReadStartElement(KeyNodeName); var key = (TKey)KeySerializer.Deserialize(reader); reader.ReadEndElement(); reader.ReadStartElement(ValueNodeName); var value = (TValue)ValueSerializer.Deserialize(reader); reader.ReadEndElement(); Add(key, value); reader.ReadEndElement(); reader.MoveToContent(); } reader.ReadEndElement(); } public void WriteXml(XmlWriter writer) { foreach (var key in Keys) { writer.WriteStartElement(ItemNodeName); writer.WriteStartElement(KeyNodeName); KeySerializer.Serialize(writer, key); writer.WriteEndElement(); writer.WriteStartElement(ValueNodeName); ValueSerializer.Serialize(writer, this[key]); writer.WriteEndElement(); writer.WriteEndElement(); } } #region Constants public readonly string DictionaryNodeName = @"Dictionary"; public readonly string ItemNodeName = @"Item"; public readonly string KeyNodeName = @"Key"; public readonly string ValueNodeName = @"Value"; #endregion Constants #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 Constructors #region Private Properties protected XmlSerializer ValueSerializer => valueSerializer ?? (valueSerializer = new XmlSerializer(typeof(TValue))); private XmlSerializer KeySerializer => keySerializer ?? (keySerializer = new XmlSerializer(typeof(TKey))); #endregion Private Properties #region Private Members private XmlSerializer keySerializer; private XmlSerializer valueSerializer; #endregion Private Members } }