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
}
}