using System;
using System.Xml.Serialization;
using System.IO;
namespace Utilities
{
/// <summary>
/// Serialisation / Deserialisation avec les generics .NET 2.0
/// Sauvegare / chargement vers fichier, string ou stream
/// </summary>
public class XMLSerialize<T> : MarshalByRefObject where T : new()
{
// Le serialiser est statique ainsi il n'est construit qu'une fois par le CLR
// gain de temps enorme qui evite de faire une reflection à chaque utilisation
static XmlSerializer m_serializer = new XmlSerializer(typeof(T));
static public T LoadFromFile(string fileName)
{
T result;
try
{
using (FileStream input = new FileStream(fileName, FileMode.Open))
{
result = (T)m_serializer.Deserialize(input);
}
}
catch
{
result = new T();
}
return result;
}
static public T LoadFromString(string data)
{
T result;
try
{
using (StringReader sr = new StringReader(data))
{
result = (T)m_serializer.Deserialize(sr);
}
}
catch
{
result = new T();
}
return result;
}
static public T LoadFromStream(Stream stream)
{
T result;
try
{
XmlSerializer read = new XmlSerializer(typeof(T));
result = (T)m_serializer.Deserialize(stream);
}
catch
{
result = new T();
}
return result;
}
public void SaveToStream(Stream stream)
{
m_serializer.Serialize(stream, this);
}
public string SaveToString()
{
StringWriter sw = new StringWriter();
m_serializer.Serialize(sw, this);
return sw.ToString();
}
public void SaveToFile(string fileName)
{
using (StreamWriter sm = new StreamWriter(fileName))
{
m_serializer.Serialize(sm, this);
}
}
}
// Exemple d'utilisation
public class Exemple : XMLSerialize<Exemple>
{
public string m_nom; public int m_age;
}
public class M
{
public static void Main()
{
Exemple e = new Exemple(); e.m_nom = "Newton";
e.m_age = 45;
string sauve = e.SaveToString(); // Sauver vers une chaîne
Exemple e2 = Exemple.LoadFromString(sauve); // Création d'une nouvelle instance
}
}
}