XmlSerializer 對象序列化成XML 自定義編碼格式(gb2312)


  隨着面向服務(SOA)的開發方式的興起,客戶端和服務端之間的消息傳送,很多采用了XML的格式。但是大家在日常的開發中,應該會有這么種體驗,就是組織xml格式的代碼太繁瑣,這篇隨筆也是為了和大家分享下簡便的組織xml字符串的解決方案。

閑話不多說,我們直接上源碼:

(1)自定義的實體類源碼(簡單的序列化我就不在贅述),大家可以仔細看下這個實體類源碼中包含了好幾個類,然后類之間有着層級調用,這樣的方式就是為了在序列化的時候實現xml元素包含元素的形式;如果想要實現同一個元素並列展示,那么就需要聲明為數組類型 如下的public long[] BlockID { get; set; }

所有要序列化的字段或者類都需要為public

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Xml.Serialization;
 6 
 7 namespace Message.Entity
 8 {
 9     [XmlRoot("Message")]//標記根節點的名字 10     public class DYAreaTypeMessage
11     {
12         public Header Header{ get; set; }
13         public Payload Payload { get; set; }
14     }
15 
16     [Serializable]
17     public class Header
18     {
19         public string Verb { get; set; }
20         public string Noun { get; set; }
21     }
22 
23     [Serializable]
24     public class Payload
25     {
26         public NetworkChangeDetail NetworkChangeDetail { get; set; }
27     }
28 
29     [Serializable]
30     public class DYAreaType
31     {
32         [XmlElement("BlockID",IsNullable=false)]//如果自己不定義元素的名字 ,那么序列化生成的元素就會變成字段類型的名稱 33         public long[] BlockID { get; set; }//注意(1)該地方是一個數組的形式,不可以用list代替,不然將不能序列化 34     }
35 
36     [Serializable]
37     public class NetworkChangeDetail
38     {
39         public DYAreaType DYAreaType
40         {
41             get;
42             set;
43         }
44 
45         [XmlElement("MessageID",IsNullable=false)]
46         public string MessageID
47         {
48             get;
49             set;
50         }
51         [XmlElement("Buro")]
52         public string Buro
53         {
54             get;
55             set;
56         }
57         [XmlElement("SubBuro")]
58         public string SubBuro
59         {
60             get;
61             set;
62         }
63 
64         [XmlElement("Description")]
65         public string Description
66         {
67             get;
68             set;
69         }
70         [XmlElement("DateTime")]
71         public string DateTime
72         {
73             get;
74             set;
75         }
76     }
(2)序列化實現代碼
  序列化的實現方法其實很簡單 使用.net提供的XmlSerializer 類就可以了 ,
             XmlSerializer serializer = new XmlSerializer(typeof(類名));
             serializer.Serialize(textWriter,類的實例);//參數說明可查看msdn
但是我們一般會遇到一個一問題就是要 指定xml的編碼格式,這個地方讓我也蛋疼了好一會,后來解決方式是這樣的
 MemoryStream ms = new MemoryStream();//定義一個內存流
 XmlTextWriter textWriter = new XmlTextWriter(ms,Encoding.GetEncoding("gb2312"));//定義輸出的編碼格式
 
         
通過以上兩句代碼即可實現自定義編碼格式,然后還有個就是把內存流轉成字符串
       string xmlMessage = Encoding.UTF8.GetString(ms.GetBuffer());
 1         /// <summary>
 2         /// 創建消息的xml語句
 3         /// </summary>
 4         /// <param name="blockID"></param>
 5         /// <param name="buro"></param>
 6         /// <param name="subBuro"></param>
 7         /// <param name="Description"></param>
 8         public string CreateMessageXML(long[] blockID, string buro, string subBuro, string Description, long activityID, out bool isSerializer)
 9         {
10             isSerializer = false;
11             CISP.Message.Entity.DYAreaTypeMessage dyArea = new CISP.Message.Entity.DYAreaTypeMessage();
12             dyArea.Header = new CISP.Message.Entity.Header() { Verb = "Update", Noun = "NetworkChangeDetail" };
13             dyArea.Payload = new CISP.Message.Entity.Payload();
14             dyArea.Payload.NetworkChangeDetail = new CISP.Message.Entity.NetworkChangeDetail()
15             {
16                 MessageID = activityID.ToString(),
17                 Buro = buro,
18                 SubBuro = subBuro,
19                 Description = Description,
20                 DateTime = DateTime.Now.ToString("G")
21             };
22 
23             dyArea.Payload.NetworkChangeDetail.DYAreaType = new CISP.Message.Entity.DYAreaType()
24             {
25                 BlockID = blockID
26             };
27 
28             MemoryStream ms = new MemoryStream();
29            // XmlTextWriter textWriter = new XmlTextWriter(ms, Encoding.GetEncoding("UTF-8"));
30             StreamWriter textWriter = new StreamWriter(ms, Encoding.GetEncoding("gb2312"));
31             XmlSerializer serializer = new XmlSerializer(typeof(CISP.Message.Entity.DYAreaTypeMessage));
32             serializer.Serialize(textWriter, dyArea);
33 
34             string xmlMessage = Encoding.UTF8.GetString(ms.GetBuffer());
35             isSerializer = true;
36             ms.Close();
37             textWriter.Close();
38             return xmlMessage;
39         }

 

 

 (3)最后我們看下結果:

<?xml version="1.0" encoding="gb2312"?>//不知道為何指定為utf8變成了gb2312
<Message xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Header>
    <Verb>Update</Verb>
    <Noun>NetworkChangeDetail</Noun>
  </Header>
  <Payload>
    <NetworkChangeDetail>
      <DYAreaType>
        <BlockID>30000299430897</BlockID>
        <BlockID>30000299511558</BlockID>
        <BlockID>30000101714620</BlockID>
        <BlockID>30000211294903</BlockID>
        <BlockID>30000299425996</BlockID>
        <BlockID>30000299425985</BlockID>
      </DYAreaType>
      <MessageID>604186</MessageID>
      <Buro>335100000</Buro>
      <SubBuro>0000145222</SubBuro>
      <Description>fff</Description>
      <DateTime>2013-12-9 13:34:52</DateTime>
    </NetworkChangeDetail>
  </Payload>
</Message>

http://www.cnblogs.com/yukaizhao/archive/2011/07/22/xml-serialization.html 這篇博客中提到以下注意點,僅供參考 沒有去驗證過。

我們在使用XmlSerializer序列化,初始化XmlSerializer對象時最好使用下面兩個構造函數否則會引起內存泄漏。
XmlSerializer(Type)
XmlSerializer.XmlSerializer(Type, object)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM