基於.net core封裝的xml序列化,反序列化操做

需求:

  因爲在.net core中去除了Xml序列化XmlSerializer操做類。所以,在於一此數據傳輸當中出,須要用到對xml格式字符串的處理問題。所以封裝了一個xml序列化與反序列化操做的類庫。git

功能:

1.將一個普通對象序列化爲一個xml,並將其對應的xml格式反序列化爲該對象;

2.將一個數組集合對象序列化爲一個xml,並將其對應的xml格式反序列化爲該對象;

3.將一個泛型集合對象序列化爲一個xml,並將其對應的xml格式反序列化爲該對象;

代碼片斷:

主要類爲:XmlSerializer<T>,其中主要方法:github

1.將對象序列化爲xml的方法:ToXml(T packet)

 1 /// <summary>
 2 /// 序列化報文爲xml
 3 /// </summary>
 4 /// <param name="packet"></param>
 5 /// <returns></returns>
 6 public string ToXml(T packet)
 7 {
 8     StringBuilder sb = new StringBuilder();
 9     if (!string.IsNullOrEmpty(_xmlHead))
10     {
11         sb.AppendFormat("{0}\r\n", _xmlHead);
12     }
13     try
14     {
15         Visit(sb, packet);
16     }
17     catch (Exception ex)
18     {
19         throw new XmlSerializerException($"序列化對象異常:{ex.Message}", ex);
20     }
21     return sb.ToString();
22 }

2.將xml內容反序列爲對象T的操做:FromXml(string xml)

 1 /// <summary>
 2 /// 序列化爲報文內容
 3 /// </summary>
 4 /// <param name="xml"><packet>標籤開始的xml內容</param>
 5 /// <returns></returns>
 6 public T FromXml(string xml)
 7 {
 8     int index;
 9     if (xml.Trim().StartsWith("<?xml") && (index = xml.IndexOf("?>")) != -1)
10     {
11         xml = xml.Substring(index + 2).Trim('\r', '\n', ' ');
12     }
13     try
14     {
15         switch (_elemType)
16         {
17             case ElementType.Generic:
18                 return VisitXmlGeneric(xml);
19             case ElementType.Array:
20                 return VisitXmlArray(xml);
21             default:
22                 return VisitXmlObject(xml);
23         }
24     }
25     catch (Exception ex)
26     {
27         throw new XmlSerializerException($"反序列化對象信息異常:{ex.Message}", ex);
28     }
29 }

使用示例:

 1 // CreatedBy: Jackie Lee(天宇遊龍)
 2 // CreatedOn: 2017-04-13
 3 // 博客:http://www.cnblogs.com/dralee
 4 /// <summary>
 5 /// 測試類
 6 /// </summary>
 7 public class PersonTest
 8 {
 9     public void Test()
10     {
11         Person p1 = new Person
12         {
13             Id = 1,
14             Name = "Jackie",
15             Gender = Gender.Male,
16             Phone = "18412345678",
17             Address = new Address { Province = "廣東", City = "深圳", Detail = "xx區xx街道xxxx號" }
18         };
19         Person p2 = new Person
20         {
21             Id = 2,
22             Name = "Hony",
23             Gender = Gender.Female,
24             Phone = "13512345678",
25             Address = new Address { Province = "廣東", City = "深圳", Detail = "yy區yy街道yyyy號" }
26         };
27 
28         XmlSerializer<Person> xs = new XmlSerializer<Person>("<?xml version=\"1.0\" encoding=\"utf - 8\"?>");
29         var xml1 = xs.ToXml(p1);
30         OutPrint("對象序列化", xml1);
31         var xml2 = xs.ToXml(p2);
32         OutPrint("xml反序列化", xml2);
33 
34         Console.WriteLine("\r\n============= 數組對象 ===============");
35 
36         var pArr = new Person[] { p1, p2 };
37         XmlSerializer<Person[]> xsArr = new XmlSerializer<Person[]>("");
38         var xml4 = xsArr.ToXml(pArr);
39         OutPrint("數組對象序列化", xml4);
40 
41         var pArr2 = xsArr.FromXml(xml4);
42         Console.WriteLine("============= 數組對象反序列化 ===============");
43         pArr2.ToList().ForEach(p =>
44         {
45             OutPrint("數組對象", p.ToString());
46         });
47 
48         Console.WriteLine("\r\n============= 泛型集合對象 ===============");
49         var ps = new List<Person> { p1, p2 };
50         XmlSerializer<List<Person>> xsList = new XmlSerializer<List<Person>>("");
51         var xml3 = xsList.ToXml(ps);
52         OutPrint("泛型集合對象序列化", xml3);
53 
54         var ps2 = xsList.FromXml(xml3);
55         Console.WriteLine("============= 泛型集合對象反序列化 ===============");
56         ps2.ForEach(p =>
57         {
58             OutPrint("泛型集合對象", p.ToString());
59         });
60     }
61 
62     private void OutPrint(string tip, string msg)
63     {
64         Console.WriteLine("======>{0}:", tip);
65         Console.WriteLine(msg);
66     }
67 }

運行效果:

 

  

類庫文件: FD.Generic.Xml.zip數組

項目源代碼已上傳github,點擊查看源碼:https://github.com/dralee/FDGenericXml測試

SamYau2014反映,已添加對CDATA值的支持,源碼見githubui

新版本效果:spa

相關文章
相關標籤/搜索