我是扩展方法的粉丝,因此我总是使用它:
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);
}
}
用于序列化:
YourClassType obj = new YourClassType();
或
List<YourClassType> obj = new List<YourClassType>();
string xml = obj.SerializeObjectToXml();
或
obj.SerializeObjectToFile("PathToYourFile"); // It will save a file with your classes serialized (works with everything with the [Serializable] attribute).
用于反序列化:
YourClassType obj = new YourClassType().DeserializeFromXml("XML string here");
List<YourClassType> obj = new List<YourClassType>().DeserializeFromFile("XML string here");
或
YourClassType obj = new YourClassType().DeserializeFromFile("PathToYourFile");
你让它运行了:)
我更喜欢扩展方法,因为它可以让你的代码非常干净,这适用于你拥有的每一种对象类型,只要它实现了 [Serializable] 属性。
如果您需要指定序列化的方式(作为节点或属性),您可以在每个属性上添加属性,例如:
[XmlElement("NameOfTheElementYouWant")]
[XmlAttribute("NameOfTheAttributeYouWant")]
[XmlText]
希望这对将来的某人有所帮助。
亚历杭德罗