XML和實(shí)體序列化和反序列化
類為我們提供了自己對(duì)象串行化(Serialize)和反串行化(Deserialize)的xml的方法,該類可以序列化的內(nèi)容:
公共類的公共讀寫字段或者屬性
XmlElement對(duì)象
XmlNode對(duì)象
Dataset對(duì)象
實(shí)現(xiàn)了Icollection 或IEnumerable的類
該類在設(shè)計(jì)中有一個(gè)設(shè)計(jì)需求:
需要被序列化的類要提供一個(gè)空參數(shù)的構(gòu)造函數(shù),否則運(yùn)行時(shí)會(huì)出現(xiàn)異常.。
在開發(fā)過程中可能會(huì)有很多地方要用到對(duì)象和XML相互轉(zhuǎn)化,在此提供一個(gè)通用的類,提供泛類型的支持。
- /// <summary>
 - /// 序列化幫助類
 - /// </summary>
 - public class SHelper
 - {
 - /// <summary>
 - /// 對(duì)象到XML-----泛類型
 - /// </summary>
 - /// <typeparam name="T"></typeparam>
 - /// <param name="obj"></param>
 - /// <returns></returns>
 - public static string SaveXmlFromObj<T>(T obj)
 - {
 - if (obj == null) return null;
 - XmlSerializer serializer = new XmlSerializer(typeof(T));
 - MemoryStream stream = new MemoryStream();
 - XmlTextWriter xtw = new XmlTextWriter(stream, Encoding.UTF8);
 - xtw.Formatting = Formatting.Indented;
 - try
 - {
 - serializer.Serialize(stream, obj);
 - }
 - catch { return null; }
 - stream.Position = 0;
 - string returnStr = string.Empty;
 - using (StreamReader sr = new StreamReader(stream, Encoding.UTF8))
 - {
 - string line = "";
 - while ((line = sr.ReadLine()) != null)
 - {
 - returnStr += line;
 - }
 - }
 - return returnStr;
 - }
 
- /// <summary>
 - /// XML到反序列化到對(duì)象----支持泛類型
 - /// </summary>
 - /// <typeparam name="T"></typeparam>
 - /// <param name="data"></param>
 - /// <returns></returns>
 - public static T LoadObjFromXML<T>(string data)
 - {
 - using (MemoryStream stream = new MemoryStream())
 - {
 - using (StreamWriter sw = new StreamWriter(stream, Encoding.UTF8))
 - {
 - sw.Write(data);
 - sw.Flush();
 - stream.Seek(0, SeekOrigin.Begin);
 - XmlSerializer serializer = new XmlSerializer(typeof(T));
 - try
 - {
 - return ((T)serializer.Deserialize(stream));
 - }
 - catch { return default(T); }
 - }
 - }
 - }
 - }
 
該類提供兩方法,一個(gè)是從實(shí)體到返回XML字符串的方法,一個(gè)是把XML字符串裝成對(duì)象實(shí)體的方法。下面我們來(lái)看看這個(gè)類是怎么用的。
首先建兩個(gè)類USer和Users,User測(cè)試一個(gè)實(shí)體的序列化和反序列化,USers測(cè)試一個(gè)List集合序列化和反序列化。注意這兩個(gè)類都標(biāo)注了[Serializable]特性,并且提供了空參數(shù)的構(gòu)造函數(shù)。
- [Serializable]
 - public class User
 - {
 - public int ID { get; set; }
 - public string Name { get; set; }
 - public string Add { get; set; }
 - public int Age { get; set; }
 - public User()
 - {
 - this.ID = default(int);
 - this.Name = default(string);
 - this.Add = default(string);
 - this.Age = default(int);
 - }}
 
- [Serializable]
 - public class Users
 - {
 - public List<User> Datas
 - { get; set; }
 - public Users()
 - { this.Datas=new List<User>();
 - }
 - }
 
下面我們建一個(gè)頁(yè)面Default.aspx,在這個(gè)頁(yè)面中我們測(cè)試序列化,提供兩個(gè)按鈕和兩個(gè)TextBox,來(lái)分別顯示單個(gè)實(shí)體的序列化和List集合的序列化。
代碼
后臺(tái)代碼的實(shí)現(xiàn):
- <form id="form1" runat="server"> <div>
 - <asp:Button ID="Button1" runat="server" Text="一個(gè)對(duì)象序列化" onclick="Button1_Click" /> <br />
 - <asp:TextBox ID="TextBox1" runat="server" Width="100%" Height="200"></asp:TextBox><br />
 - <asp:Button ID="Button2" runat="server" Text="多個(gè)對(duì)象序列化" onclick="Button2_Click" /><br />
 - <asp:TextBox ID="TextBox2" runat="server" Width="100%" Height="200">
 - </asp:TextBox><br /> </div> </form>
 
代碼
- /// <summary>
 - /// 一個(gè)對(duì)象序列化
 - /// </summary>
 - /// <param name="sender"></param>
 - /// <param name="e"></param> protected void Button1_Click(object sender, EventArgs e)
 - { User user = new User()
 - { ID=1001,Name="小王",Add="北京",Age=21};
 - var str = SHelper.SaveXmlFromObj<User>(user); this.TextBox1.Text = str; }
 - /// <summary>
 - /// 多個(gè)對(duì)象序列化
 - /// </summary>
 - /// <param name="sender"></param>
 - /// <param name="e"></param> protected void Button2_Click(object sender, EventArgs e)
 - { Users users = new Users(); User user = new User()
 - { ID = 1001, Name = "小王", Add = "北京", Age = 21 }; users.Datas.Add(user);
 - users.Datas.Add(user);
 - users.Datas.Add(user);
 - var str = SHelper.SaveXmlFromObj<Users>(users); this.TextBox2.Text = str; }
 
序列化結(jié)果如下:
單對(duì)象:
- <?xml version="1.0"?>
 - <User xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 - xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <ID>1001</ID>
 - <Name>小王</Name> <Add>北京</Add>
 - <Age>21</Age></User>
 
List集合:
- <?xml version="1.0"?>
 - <Users xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 - xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Datas> <User> <ID>1001</ID>
 - <Name>小王</Name> <Add>北京</Add> <Age>21</Age> </User> <User> <ID>1001</ID>
 - <Name>小王</Name>
 - <Add>北京</Add> <Age>21</Age> </User> <User> <ID>1001</ID>
 - <Name>小王</Name> <Add>北京</Add> <Age>21</Age> </User> </Datas></Users>
 
下面我們來(lái)測(cè)試反序列化:
首先建一個(gè)webservice,寫兩個(gè)測(cè)試方法:
代碼
- [WebMethod]
 - public string GetObjFromXml(string data)
 - { var obj = SHelper.LoadObjFromXML<User>(data);
 - if (obj != null)
 - { return obj.Name; }
 - else
 - { return "傳入數(shù)據(jù)出錯(cuò)"; } }
 - [WebMethod]
 - public string GetObjsFromXml(string data)
 - { var obj = SHelper.LoadObjFromXML<Users>(data);
 - if (obj != null)
 - { string returnstr = "";
 - foreach (User user in obj.Datas)
 - { returnstr += user.Name + "\n"; }
 - return returnstr; }
 - else { return "傳入數(shù)據(jù)出錯(cuò)"; }
 - }
 
編譯后運(yùn)行,我們用剛才序列化出來(lái)的字符串貼出參數(shù)值位置就可以測(cè)試反序列化的方法,在此不再詳述,有興趣的童鞋可以把實(shí)例代碼運(yùn)行。
【編輯推薦】















 
 
 


 
 
 
 