using System.Collections.Generic; using System.Xml.Serialization; namespace Developpez.Dotnet.Collections { /// /// Dictionnaire générique sérialisable en XML /// Librement adapté de http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx /// /// Type de la clé /// Type de la valeur [XmlRoot("Dictionary")] public class SerializableDictionary : Dictionary, IXmlSerializable { #region Constructeurs /// /// Initialise une nouvelle instance de SerializableDictionary /// public SerializableDictionary() { } /// /// Initialise une nouvelle instance de SerializableDictionary, avec la capacité initiale spécifiée /// /// Capacité initiale public SerializableDictionary(int capacity) : base(capacity) { } /// /// Initialise une nouvelle instance de SerializableDictionary avec les données copiées du dictionnaire spécifié /// /// Le dictionnaire à copier public SerializableDictionary(IDictionary dictionary) : base(dictionary) { } /// /// Initialise une nouvelle instance de SerializableDictionary avec le comparateur de clé spécifié /// /// Comparateur de clé à utiliser public SerializableDictionary(IEqualityComparer comparer) : base(comparer) { } /// /// Initialise une nouvelle instance de SerializableDictionary avec la capacité initiale et le /// comparateur de clé spécifiés /// /// Capacité initiale /// Comparateur de clé à utiliser public SerializableDictionary(int capacity, IEqualityComparer comparer) : base(capacity, comparer) { } /// /// Initialise une nouvelle instance de SerializableDictionary avec les données copiées du dictionnaire spécifié, /// avec le comparateur de clé spécifié /// /// Dictionnaire à copier /// Comparateur de clé à utiliser public SerializableDictionary(IDictionary dictionary, IEqualityComparer comparer) : base(dictionary, comparer) { } #endregion #region IXmlSerializable Members /// /// Renvoie le schémar XML de l'objet /// /// null System.Xml.Schema.XmlSchema IXmlSerializable.GetSchema() { return null; } /// /// Lit les données du dictionnaire à partir du flux XML spécifié /// /// Flux XML à désérialiser void IXmlSerializable.ReadXml(System.Xml.XmlReader reader) { XmlSerializer keySerializer = new XmlSerializer(typeof(TKey)); XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue)); bool wasEmpty = reader.IsEmptyElement; reader.Read(); if (wasEmpty) return; while (reader.NodeType != System.Xml.XmlNodeType.EndElement) { 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(); } reader.ReadEndElement(); } /// /// Ecrit les données du dictionnaire sur le flux XML spécifié /// /// Flux XML vers lequel sérialiser les données void IXmlSerializable.WriteXml(System.Xml.XmlWriter writer) { XmlSerializer keySerializer = new XmlSerializer(typeof(TKey)); XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue)); foreach (TKey key in this.Keys) { writer.WriteStartElement("Item"); writer.WriteStartElement("Key"); keySerializer.Serialize(writer, key); writer.WriteEndElement(); writer.WriteStartElement("Value"); TValue value = this[key]; valueSerializer.Serialize(writer, value); writer.WriteEndElement(); writer.WriteEndElement(); } } #endregion } }