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í)體的方法。下面我們來看看這個(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è)頁面Default.aspx,在這個(gè)頁面中我們測(cè)試序列化,提供兩個(gè)按鈕和兩個(gè)TextBox,來分別顯示單個(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>
下面我們來測(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)行,我們用剛才序列化出來的字符串貼出參數(shù)值位置就可以測(cè)試反序列化的方法,在此不再詳述,有興趣的童鞋可以把實(shí)例代碼運(yùn)行。
【編輯推薦】