using System;
using System.IO;
using System.Reflection;
using System.Xml;
using System.Xml.Serialization;
namespace UtilLib
{
public static class XmlHelper
{
static readonly XmlSerializerNamespaces DEFAULT_NS = new XmlSerializerNamespaces();
static XmlHelper()
{
DEFAULT_NS.Add("", "");
}
///
/// serialize object to xml file.
///
/// the path to save the xml file
/// the object you want to serialize
public static void SerializeToXml(string path, object obj)
{
XmlSerializer serializer = new XmlSerializer(obj.GetType());
string content = string.Empty;
//serialize
using (StringWriter writer = new StringWriter())
{
serializer.Serialize(writer, obj, DEFAULT_NS);
content = writer.ToString();
}
//save to file
using (StreamWriter stream_writer = new StreamWriter(path))
{
stream_writer.Write(content);
}
}
///
/// xml 文件反序列化为对象
///
/// 序列化类型
/// the path of the xml file
/// 对象
public static T DeserializeFromXml(string path)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (StreamReader reader = new StreamReader(path))
{
return (T)serializer.Deserialize(reader);
}
}
public static bool ReadFromXml(T obj, string path)
{
XmlDocument xd = new XmlDocument();
xd.Load(path);
Type type = typeof(T);
XmlNode root = xd.SelectSingleNode(type.Name);
if (root == null)
{
return false;
}
//获取 RefHero 中所有的实例私有字段
FieldInfo[] fieldArray = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);
foreach (FieldInfo filed in fieldArray)
{
string fileName = filed.Name;
XmlNode node = root.SelectSingleNode(fileName);
if (node == null)
{
continue;
}
filed.SetValue(obj, node.InnerText);
}
return true;
}
public static T DeepClone(T data)
{
using (MemoryStream stream = new MemoryStream())
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
serializer.Serialize(stream, data);
stream.Seek(0, SeekOrigin.Begin);
return (T)serializer.Deserialize(stream);
}
}
}
}