Xml序列化和反序列化
public class XMLHelper
{
public static string Serialize<T>(T entity, Encoding encoding = null)
{
StringBuilder sb = new StringBuilder();
XmlSerializer serializer = new XmlSerializer(typeof(T), GetTypes(obj));
if (encoding == null)
{
using (TextWriter tw = new StringWriter(sb))
serializer.Serialize(tw, entity);
return sb.ToString();
}
using (MemoryStream ms = new MemoryStream())
using (StreamWriter sw = new StreamWriter(ms, encoding))
{
serializer.Serialize(sw, entity);
byte[] bytes = ms.ToArray();
return encoding.GetString(bytes, 0, bytes.Length);
}
}
public static void AppendSerializeNameSpace(XmlDocument doc)
{
if (string.IsNullOrWhiteSpace(doc.InnerText)) return;
if (!doc.DocumentElement.HasAttribute("xmlns:xsi"))
doc.DocumentElement.SetAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
if (!doc.DocumentElement.HasAttribute("xmlns:xsd"))
doc.DocumentElement.SetAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
}
public static void SerializeToFile<T>(string filePath, T obj, string rootName = null)
{
using (StreamWriter sw = new StreamWriter(filePath))
{
XmlSerializer serializer = string.IsNullOrWhiteSpace(rootName) ?
new XmlSerializer(typeof(T), GetTypes(obj))
: new XmlSerializer(typeof(T), null, GetTypes(obj), new XmlRootAttribute(rootName), null);
serializer.Serialize(sw, obj);
}
}
public static T DeserializeFromFile<T>(string filePath)
{
using (StreamReader sr = new StreamReader(filePath))
{
var setting = new XmlReaderSettings
{
CheckCharacters = false//保留等于空格的字符串值,默认会忽略空格而赋值为null,比如<demo> </demo>,解析默认会demo=null,CheckCharacters=false时demo=" "
};
using (XmlReader r = XmlReader.Create(sr, setting))
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
return (T)serializer.Deserialize(r);
}
}
}
public static T Deserialize<T>(string xmlString)
{
T cloneObject = default(T);
StringBuilder buffer = new StringBuilder();
buffer.Append(xmlString);
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (TextReader reader = new StringReader(buffer.ToString()))
{
Object obj = serializer.Deserialize(reader);
cloneObject = (T)obj;
}
return cloneObject;
}
/// <summary>
/// 派生类序列化
///</summary>
public static Type[] GetTypes(object o)
{
Type type = o.GetType();
HashSet<Type> types= new HashSet<Type> { o.GetType() };
var properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
foreach (var item in properties)
{
if(item.PropertyType.IsClass && item.PropertyType != typeof(string))
{
object v = item.GetValue(o);
if (v == null) continue;
var ins = item.PropertyType.GetInterfaces();
if (ins != null && ins.Contains(typeof(IEnumerable)))
{
IEnumerator enumerator = (v as IEnumerable)?.GetEnumerator();
if (enumerator != null)
while (enumerator.MoveNext())
{
var ts = GetTypes(enumerator.Current);
if (ts != null)
foreach (var t in ts)
types.Add(t);
}
}
else
{
var ts = GetTypes(v);
if (ts != null)
foreach (var t in ts)
types.Add(t);
}
}
}
return types.ToArray();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构