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