C#对于XML的序列化与反序列化提供了很好的支持,我们只需要引用System.Xml的命名空间即可,无需使用第三方库,下面简单实现了一个XML的序列化与反序列化的帮助类。
1.序列化:
先声明一个变量var settings = new XmlWriterSettings,分别设置两个属性Encoding = new UTF8Encoding(false)和 Indent = true。第一个从字面意思即可知道是设置要使用的文本编码的类型,但为什么这里没有使用默认的Encoding.UTF8呢,这是因为如果用Encoding.UTF8将在输出文本的最前面添加4个字节的非xml内容。Indent属性表示是否缩进元素。第二点需要注意的是XmlSerializerNamespaces这里,var ns声明一个变量并添加空元素的意义在于强制指定命名空间,覆盖默认的命名空间。
2.反序列化:
反序列化相对来说就比较简单了,IsNullOrEmpty的意义在于当传入的字符串是null或者空时函数就返回true,否则返回false。可以参看源码的实现。
public static bool IsNullOrEmpty(string value){ return value == null || value.Length == 0; }
其它的就参看源码吧。
1 using System; 2 using System.IO; 3 using System.Text; 4 using System.Xml; 5 using System.Xml.Serialization; 6 7 namespace XmlHelper 8 { 9 public static class XmlSerializeHelper 10 { 11 /// <summary> 12 /// XML序列化 13 /// </summary> 14 /// <typeparam name="T"></typeparam> 15 /// <param name="obj"></param> 16 /// <returns></returns> 17 public static string XmlSerializer<T>(T obj) 18 { 19 var settings = new XmlWriterSettings 20 { 21 Encoding = new UTF8Encoding(false), 22 Indent = true 23 }; 24 25 using (var ms = new MemoryStream()) 26 { 27 using (var xw = XmlWriter.Create(ms, settings)) 28 { 29 var ns = new XmlSerializerNamespaces(); 30 ns.Add("", ""); 31 var serializer = new XmlSerializer(obj.GetType()); 32 serializer.Serialize(xw, obj, ns); 33 return Encoding.UTF8.GetString(ms.ToArray()); 34 } 35 } 36 } 37 38 /// <summary> 39 /// XML反序列化 40 /// </summary> 41 /// <typeparam name="T"></typeparam> 42 /// <param name="XmlString"></param> 43 /// <returns></returns> 44 public static T XmlDeserialize<T>(this string XmlString) 45 { 46 if (string.IsNullOrEmpty(XmlString)) 47 throw new ArgumentNullException("s"); 48 49 using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(XmlString))) 50 { 51 using (var xr = XmlReader.Create(ms)) 52 { 53 var xmlSerializer = new XmlSerializer(typeof(T)); 54 return (T)xmlSerializer.Deserialize(xr); 55 } 56 } 57 } 58 59 /// <summary> 60 /// XML保存到本地 61 /// </summary> 62 /// <param name="strXml"></param> 63 /// <returns></returns> 64 public static void SavaToFile(string strXml) 65 { 66 string filepath = "d:\\Log\\"; 67 if (!Directory.Exists(filepath)) 68 Directory.CreateDirectory(filepath); 69 70 string fileName = DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".xml"; 71 using (FileStream fs = new FileStream(filepath + fileName, FileMode.Create)) 72 { 73 byte[] xmlBytes = Encoding.UTF8.GetBytes(strXml); 74 fs.Write(xmlBytes, 0, xmlBytes.Length); 75 } 76 } 77 } 78 }