XmlSerializer 对象序列化成XML 自定义编码格式(gb2312)
生活随笔
收集整理的這篇文章主要介紹了
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.Entity8 {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)最后我們看下結果:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?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)
總結
以上是生活随笔為你收集整理的XmlSerializer 对象序列化成XML 自定义编码格式(gb2312)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: drbd(一):简介和安装
- 下一篇: memcache的介绍与应用场景