Ich bin Fan von Erweiterungsmethoden, deshalb benutze ich diese immer:
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);
}
}
Nutzungs zu serialisiert:
YourClassType obj = new YourClassType();
oder
List<YourClassType> obj = new List<YourClassType>();
string xml = obj.SerializeObjectToXml();
oder
obj.SerializeObjectToFile("PathToYourFile"); // It will save a file with your classes serialized (works with everything with the [Serializable] attribute).
Nutzungs deserialisieren:
YourClassType obj = new YourClassType().DeserializeFromXml("XML string here");
List<YourClassType> obj = new List<YourClassType>().DeserializeFromFile("XML string here");
oder
YourClassType obj = new YourClassType().DeserializeFromFile("PathToYourFile");
Und Sie haben es läuft :)
Ich bevorzuge Erweiterungsmethoden, weil es Ihnen erlaubt, Ihren Code sehr sauber zu haben, dies funktioniert mit jeder Art von Objekttyp, den Sie haben, sofern es das Attribut [Serializable]
implementiert.
Wenn Sie angeben müssen, wie es (als Knoten oder Attribute) serialisiert werden, können Sie das Attribut auf jedem Ihrer Eigenschaften hinzufügen wie:
[XmlElement("NameOfTheElementYouWant")]
[XmlAttribute("NameOfTheAttributeYouWant")]
[XmlText]
Hope this jemand in der Zukunft hilft.
Alejandro
-1 für das Nicht-Implementieren von "using" -Blöcken und das Nicht-Verwenden von Generics. –
mit (XmlSerializer deserializer = neue XmlSerializer (_type)) funktioniert nicht. XmlSerializer hat IDisposable nicht implementiert. Die richtige sollte wie die Antwort von John sein und XmlSerializer außerhalb des using-Blocks setzen. –
Ups, vergaß für einen Moment, dass XmlSerializer IDisposable nicht implementiert, korrigiert :) – amazedsaint