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 }
?