XML和实体序列化和反序列化
创始人
2024-07-29 10:51:26
0

类为我们提供了自己对象串行化(Serialize)和反串行化(Deserialize)的xml的方法,该类可以序列化的内容:   

公共类的公共读写字段或者属性   

XmlElement对象

XmlNode对象

Dataset对象    

实现了Icollection 或IEnumerable的类

该类在设计中有一个设计需求:

需要被序列化的类要提供一个空参数的构造函数,否则运行时会出现异常.。

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

  1. ///     
  2.    /// 序列化帮助类    
  3.    ///     
  4.    public class SHelper    
  5.    {    
  6.        ///     
  7.        /// 对象到XML-----泛类型    
  8.        ///     
  9.        ///     
  10.        ///     
  11.        ///     
  12.        public static string SaveXmlFromObj(T obj)    
  13.        {    
  14.            if (obj == null) return null;    
  15.            XmlSerializer serializer = new XmlSerializer(typeof(T));    
  16.            MemoryStream stream = new MemoryStream();    
  17.            XmlTextWriter xtw = new XmlTextWriter(stream, Encoding.UTF8);    
  18.            xtw.Formatting = Formatting.Indented;    
  19.            try   
  20.            {    
  21.                serializer.Serialize(stream, obj);    
  22.            }    
  23.            catch { return null; }    
  24.            stream.Position = 0;    
  25.            string returnStr = string.Empty;    
  26.            using (StreamReader sr = new StreamReader(stream, Encoding.UTF8))    
  27.            {    
  28.                string line = "";    
  29.                while ((line = sr.ReadLine()) != null)    
  30.                {    
  31.                    returnStr += line;    
  32.                }    
  33.            }    
  34.            return returnStr;    
  35.        }   
  1. ///  
  2. /// XML到反序列化到对象----支持泛类型  
  3. ///  
  4. ///  
  5. ///  
  6. ///  
  7. public static T LoadObjFromXML(string data)  
  8. {  
  9. using (MemoryStream stream = new MemoryStream())  
  10. {  
  11. using (StreamWriter sw = new StreamWriter(stream, Encoding.UTF8))  
  12. {  
  13. sw.Write(data);  
  14. sw.Flush();  
  15. stream.Seek(0, SeekOrigin.Begin);  
  16. XmlSerializer serializer = new XmlSerializer(typeof(T));  
  17. try  
  18. {  
  19. return ((T)serializer.Deserialize(stream));  
  20. }  
  21. catch { return default(T); }  
  22. }  
  23. }  
  24. }  

该类提供两方法,一个是从实体到返回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 Datas   
  5. { get; set; }   
  6. public Users()  
  7.  { this.Datas=new List();   
  8. }  
  9.  }  
  10.  

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

代码

后台代码的实现:

  1.  
       
  2.     
  3.    
  4.    
  5.  
  6.  
  

代码 

  1. ///    
  2. /// 一个对象序列化   
  3. ///    
  4. ///    
  5. ///  protected void Button1_Click(object sender, EventArgs e)   
  6. { User user = new User()   
  7. { ID=1001,Name="小王",Add="北京",Age=21};   
  8. var str = SHelper.SaveXmlFromObj(user); this.TextBox1.Text = str; }   
  9. ///    
  10. /// 多个对象序列化   
  11. ///    
  12. ///    
  13. ///  protected void Button2_Click(object sender, EventArgs e)   
  14. { Users users = new Users(); User user = new User()   
  15. { ID = 1001, Name = "小王", Add = "北京", Age = 21 }; users.Datas.Add(user);  
  16.  users.Datas.Add(user);  
  17.  users.Datas.Add(user);  
  18.  var str = SHelper.SaveXmlFromObj(users); this.TextBox2.Text = str; } 

序列化结果如下:

单对象:

  1.  
  2. xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 1001   
  3. 小王 北京   
  4. 21 
  5.  

List集合:

  1.  
  2. xmlns:xsd="http://www.w3.org/2001/XMLSchema">   1001   
  3. 小王 北京 21   1001   
  4. 小王   
  5. 北京 21   1001   
  6. 小王 北京 21   
  7.  

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

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

代码 

  1. [WebMethod]   
  2. public string GetObjFromXml(string data)   
  3. { var obj = SHelper.LoadObjFromXML(data);   
  4. if (obj != null)   
  5. { return obj.Name; }   
  6. else   
  7. { return "传入数据出错"; } }   
  8. [WebMethod]   
  9. public string GetObjsFromXml(string data)   
  10. { var obj = SHelper.LoadObjFromXML(data);   
  11. if (obj != null)   
  12. { string returnstr = "";   
  13. foreach (User user in obj.Datas)   
  14. { returnstr += user.Name + "\n"; }   
  15. return returnstr; }   
  16. else { return "传入数据出错"; }  
  17.  }  

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

【编辑推荐】

  1. 2.1 Web应用和web.xml文件
  2. 详谈XML的应用分类及前景
  3. XML数据读取方式性能比较
  4. Android学习笔记:Layout.xml属性

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...