A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郑昱曦 中级黑马   /  2012-11-11 13:43  /  1748 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  近来的项目中用到了序列化就抽空学习了一下,拿出来给大家分享一下:

  类为我们提供了自己对象串行化(Serialize)和反串行化(Deserialize)的xml的方法,该类可以序列化的内容:
    公共类的公共读写字段或者属性
    XmlElement对象
    XmlNode对象
    Dataset对象
    实现了Icollection 或IEnumerable的类

  该类在设计中有一个设计需求:
    需要被序列化的类要提供一个空参数的构造函数,否则运行时会出现异常

  在开发过程中可能会有很多地方要用到对象和XML相互转化,在此提供一个通用的类,提供泛类型的支持。

  该类提供两方法,一个是从实体到返回XML字符串的方法,一个是把XML字符串装成对象实体的方法。下面我们来看看这个类是怎么用的。

  首先建两个类USer和Users,User测试一个实体的序列化和反序列化,USers测试一个List集合序列化和反序列化。注意这两个类都标注了[Serializable]特性,并且提供了空参数的构造函数。

  1. [Serializable]
  2.     public class User
  3.     {
  4.         public int ID { get; set; }
  5.         public string Name { get; set; }
  6.         public string Add { get; set; }
  7.         public int Age { get; set; }
  8.         public User()
  9.         {
  10.             this.ID = default(int);
  11.             this.Name = default(string);
  12.             this.Add = default(string);
  13.             this.Age = default(int);
  14.         }

  15.     }
复制代码
  1. [Serializable]
  2. public class Users
  3. {
  4.         public List<User> Datas { get; set; }
  5.         public Users()
  6.         {
  7.             this.Datas=new List<User>();
  8.         }
  9.     }
复制代码

下面我们建一个页面Default.aspx,在这个页面中我们测试序列化,提供两个按钮和两个TextBox,来分别显示单个实体的序列化和List集合的序列化。

  1. <form id="form1" runat="server">
  2.     <div>
  3.         <asp:Button ID="Button1" runat="server" Text="一个对象序列化"
  4.             onclick="Button1_Click" />
  5.         

  6.         <asp:TextBox ID="TextBox1" runat="server" Width="100%" Height="200"></asp:TextBox>

  7.         <asp:Button ID="Button2" runat="server" Text="多个对象序列化"
  8.             onclick="Button2_Click" />

  9.         <asp:TextBox ID="TextBox2" runat="server" Width="100%" Height="200"></asp:TextBox>

  10.     </div>
  11.     </form>
复制代码

     后台代码的实现:

  1. /// <summary>
  2.         /// 一个对象序列化
  3.         /// </summary>
  4.         /// <param name="sender"></param>
  5.         /// <param name="e"></param>
  6.         protected void Button1_Click(object sender, EventArgs e)
  7.         {
  8.             User user = new User() { ID=1001,Name="小王",Add="北京",Age=21};
  9.             var str = SHelper.SaveXmlFromObj<User>(user);
  10.             this.TextBox1.Text = str;
  11.         }

  12.         /// <summary>
  13.         /// 多个对象序列化
  14.         /// </summary>
  15.         /// <param name="sender"></param>
  16.         /// <param name="e"></param>
  17.         protected void Button2_Click(object sender, EventArgs e)
  18.         {
  19.             Users users = new Users();
  20.             User user = new User() { ID = 1001, Name = "小王", Add = "北京", Age = 21 };
  21.             users.Datas.Add(user);
  22.             users.Datas.Add(user);
  23.             users.Datas.Add(user);

  24.             var str = SHelper.SaveXmlFromObj<Users>(users);
  25.             this.TextBox2.Text = str;
  26.         }
复制代码

  序列化结果如下:

  单对象:

  1. <?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集合

  1. <?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>
复制代码

  下面我们来测试反序列化:

  首先建一个webservice,写两个测试方法:

  1. [WebMethod]
  2.         public string GetObjFromXml(string data)
  3.         {
  4.             var obj = SHelper.LoadObjFromXML<User>(data);
  5.             if (obj != null)
  6.             { return obj.Name; }
  7.             else { return "传入数据出错"; }
  8.         }

  9.         [WebMethod]
  10.         public string GetObjsFromXml(string data)
  11.         {
  12.             var obj = SHelper.LoadObjFromXML<Users>(data);
  13.             if (obj != null)
  14.             {
  15.                 string returnstr = "";
  16.                 foreach (User user in obj.Datas)
  17.                 {
  18.                     returnstr += user.Name + "\n";
  19.                 }
  20.                 return returnstr;
  21.             }
  22.             else { return "传入数据出错"; }
  23.         }
复制代码

  编译后运行,我们用刚才序列化出来的字符串贴出参数值位置就可以测试反序列化的方法,在此不再详述,有兴趣的童鞋可以把实例代码运行。


评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2 很给力!

查看全部评分

1 个回复

正序浏览
值得学习ing!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马