Je suis fan de méthodes d'extension, donc j'utiliser ce toujours:
using System.IO;
using System.Xml.Serialization;
public static class SerializationExtensionMethods
{
/// <summary>
/// Serializes the object.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="toSerialize">To serialize.</param>
/// <returns></returns>
public static string SerializeObjectToXml<T>(this T toSerialize)
{
XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType());
StringWriter textWriter = new StringWriter();
xmlSerializer.Serialize(textWriter, toSerialize);
return textWriter.ToString();
}
/// <summary>
/// Serializes the object.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="toSerialize">To serialize.</param>
/// <param name="path">The path.</param>
public static void SerializeObjectToFile<T>(this T toSerialize, string path)
{
string xml = SerializeObjectToXml<T>(toSerialize);
using (StreamWriter sw = new StreamWriter(path, false))
{
sw.Write(xml);
}
}
/// <summary>
/// Deserializes the specified XML.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="xml">The XML.</param>
/// <returns></returns>
public static T DeserializeFromXml<T>(this T original, string xml)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
TextReader textReader = new StringReader(xml);
return (T)serializer.Deserialize(textReader);
}
/// <summary>
/// Deserializes the specified object.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="original">The original.</param>
/// <param name="path">The path.</param>
/// <returns></returns>
public static T DeserializeFromFile<T>(this T original, string path)
{
string xml = string.Empty;
using (StreamReader sr = new StreamReader(path))
{
xml = sr.ReadToEnd();
}
return DeserializeFromXml<T>(original, xml);
}
}
Utilisation sérialiser:
YourClassType obj = new YourClassType();
ou
List<YourClassType> obj = new List<YourClassType>();
string xml = obj.SerializeObjectToXml();
ou
obj.SerializeObjectToFile("PathToYourFile"); // It will save a file with your classes serialized (works with everything with the [Serializable] attribute).
Utilisation désérialiser:
YourClassType obj = new YourClassType().DeserializeFromXml("XML string here");
List<YourClassType> obj = new List<YourClassType>().DeserializeFromFile("XML string here");
ou
YourClassType obj = new YourClassType().DeserializeFromFile("PathToYourFile");
Et vous l'avez en cours d'exécution :)
Je préfère les méthodes d'extension, car cela vous permet d'avoir votre code très propre, cela fonctionne avec tous les types d'objets que vous avez, dans la mesure où il implémente l'attribut [Serializable]
.
Si vous devez spécifier comment il sera publié en feuilleton (comme des nœuds ou des attributs), vous pouvez ajouter l'attribut sur chacun de vos propriétés telles que:
[XmlElement("NameOfTheElementYouWant")]
[XmlAttribute("NameOfTheAttributeYouWant")]
[XmlText]
L'espoir que cela aide quelqu'un à l'avenir.
Alejandro
-1 pour ne pas implémenter les blocs "using", et pour ne pas utiliser de génériques. –
using (XmlSerializer deserializer = new XmlSerializer (_type)) ne fonctionne pas. XmlSerializer n'a pas implémenté IDisposable. La bonne devrait ressembler à celle de John, mettant XmlSerializer en dehors du bloc using. –
Oups, oublié un instant que XmlSerializer n'a pas implémenté IDisposable, corrigé :) – amazedsaint