using System; using System.Collections.Generic; using System.IO; using System.Xml; using System.Xml.Serialization; namespace Developpez.Dotnet.Xml.Serialization { /// /// Fournit des méthodes d'extension pour faciliter la sérialization XML /// public static class XmlSerializationExtensions { #region Membres privés private static readonly Dictionary _serializers; static XmlSerializationExtensions() { _serializers = new Dictionary(); } private static XmlSerializer GetSerializer() { lock (_serializers) { XmlSerializer xs; if (!_serializers.TryGetValue(typeof(T), out xs)) { xs = new XmlSerializer(typeof(T)); _serializers.Add(typeof(T), xs); } return xs; } } #endregion #region Raccourcis pour la sérialisation XML /// /// Renvoie une chaine de caractères contenant la représentation XML /// de l'objet /// /// Type de l'objet à sérialiser /// Objet à sérialiser /// La représentation XML de l'objet public static string ToXml(this T obj) { return obj.ToXml(null); } /// /// Renvoie une chaine de caractères contenant la représentation XML /// de l'objet, en précisant les namespaces XML à utiliser /// /// Type de l'objet à sérialiser /// Objet à sérialiser /// Namespaces XML à utiliser /// La représentation XML de l'objet public static string ToXml(this T obj, XmlSerializerNamespaces namespaces) { using (StringWriter wr = new StringWriter()) { obj.WriteXml(wr, namespaces); return wr.ToString(); } } /// /// Crée un objet à partir de sa représentation XML /// /// Type de l'objet à désérialiser /// Représentation XML de l'objet /// L'objet correspondant à la représentation XML public static T ParseXml(this string xml) { using (StringReader rd = new StringReader(xml)) { return rd.ReadXml(); } } /// /// Sérialise un objet en XML dans le fichier spécifié /// /// Type de l'objet à sérialiser /// Objet à sérialiser /// Chemin du fichier public static void WriteXml(this T obj, string path) { obj.WriteXml(path, null); } /// /// Sérialise un objet en XML dans le fichier spécifié, en utilisant les /// namespaces XML spécifiés /// /// Type de l'objet à sérialiser /// Objet à sérialiser /// Chemin du fichier /// Namespaces XML à utiliser public static void WriteXml(this T obj, string path, XmlSerializerNamespaces namespaces) { using (Stream stream = File.OpenWrite(path)) { obj.WriteXml(stream, namespaces); } } /// /// Sérialise un objet en XML dans le flux spécifié /// /// Type de l'objet à sérialiser /// Objet à sérialiser /// Flux dans lequel sérialiser l'objet public static void WriteXml(this T obj, Stream stream) { obj.WriteXml(stream, null); } /// /// Sérialise un objet en XML dans le flux spécifié, en utilisant les /// namespaces XML spécifiés /// /// Type de l'objet à sérialiser /// Objet à sérialiser /// Flux dans lequel sérialiser l'objet /// Namespaces XML à utiliser public static void WriteXml(this T obj, Stream stream, XmlSerializerNamespaces namespaces) { var xs = GetSerializer(); xs.Serialize(stream, obj, namespaces); } /// /// Sérialise un objet en XML dans le TextWriter spécifié /// /// Type de l'objet à sérialiser /// Objet à sérialiser /// TextWriter dans lequel sérialiser l'objet public static void WriteXml(this T obj, TextWriter writer) { obj.WriteXml(writer, null); } /// /// Sérialise un objet en XML dans le TextWriter spécifié, en utilisant les /// namespaces XML spécifiés /// /// Type de l'objet à sérialiser /// Objet à sérialiser /// TextWriter dans lequel sérialiser l'objet /// Namespaces XML à utiliser public static void WriteXml(this T obj, TextWriter writer, XmlSerializerNamespaces namespaces) { var xs = GetSerializer(); xs.Serialize(writer, obj, namespaces); } /// /// Sérialise un objet en XML dans le XmlWriter spécifié /// /// Type de l'objet à sérialiser /// Objet à sérialiser /// XmlWriter dans lequel sérialiser l'objet public static void WriteXml(this T obj, XmlWriter writer) { obj.WriteXml(writer, null); } /// /// Sérialise un objet en XML dans le XmlWriter spécifié, en utilisant les /// namespaces XML spécifiés /// /// Type de l'objet à sérialiser /// Objet à sérialiser /// XmlWriter dans lequel sérialiser l'objet /// Namespaces XML à utiliser public static void WriteXml(this T obj, XmlWriter writer, XmlSerializerNamespaces namespaces) { var xs = GetSerializer(); xs.Serialize(writer, obj, namespaces); } /// /// Crée un objet à partir de sa représentation XML dans le fichier spécifié /// /// Type de l'objet à désérialiser /// Chemin du fichier /// L'objet correspondant à la représentation XML public static T ReadXml(this string path) { using (Stream stream = File.OpenRead(path)) { return stream.ReadXml(); } } /// /// Crée un objet à partir de sa représentation XML dans le flux spécifié /// /// Type de l'objet à désérialiser /// Flux contenant la représentation XML de l'objet /// L'objet correspondant à la représentation XML public static T ReadXml(this Stream stream) { var xs = GetSerializer(); return (T)xs.Deserialize(stream); } /// /// Crée un objet à partir de sa représentation XML dans le TextReader spécifié /// /// Type de l'objet à désérialiser /// TextReader contenant la représentation XML de l'objet /// L'objet correspondant à la représentation XML public static T ReadXml(this TextReader reader) { var xs = GetSerializer(); return (T)xs.Deserialize(reader); } #if !SILVERLIGHT // XmlDeserializationEvents non supporté en SL /// /// Crée un objet à partir de sa représentation XML dans le XmlReader spécifié /// /// Type de l'objet à désérialiser /// XmlReader contenant la représentation XML de l'objet /// L'objet correspondant à la représentation XML public static T ReadXml(this XmlReader reader) { return reader.ReadXml(default(XmlDeserializationEvents)); } /// /// Crée un objet à partir de sa représentation XML dans le XmlReader spécifié, en utilisant /// les évènements de désérialisation spécifiés /// /// Type de l'objet à désérialiser /// XmlReader contenant la représentation XML de l'objet /// Evènements de désérialisation à utiliser /// L'objet correspondant à la représentation XML public static T ReadXml(this XmlReader reader, XmlDeserializationEvents events) { var xs = GetSerializer(); return (T)xs.Deserialize(reader, events); } #endif #endregion #region Sérialisation d'un dictionnaire /// /// Renvoie un objet sérialisable en XML representant les données d'un dictionnaire /// /// Type de clé /// Type de valeur /// Dictionnaire à sérialiser /// Une collection de paires clé/valeur, équivalente au dictionnaire et sérialisable en XML public static XmlDictionaryEntryCollection AsXmlSerializable(this IDictionary dictionary) { if (dictionary != null) return new XmlDictionaryEntryCollection(dictionary); return null; } #endregion } }