XML和实体序列化和反序列化

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

我们提供的服务有:成都做网站、成都网站制作、微信公众号开发、网站优化、网站认证、友谊ssl等。为上1000家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的友谊网站制作公司

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

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. }
  25. }

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

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

代码

后台代码的实现:

 
 
 
  1.  
     
  2.   
  3.  
  4.  
  5.  
 

代码

 
 
 
  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. xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 1001 
  2. 小王 北京 
  3. 21

List集合:

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

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

首先建一个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.  }

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

网站栏目:XML和实体序列化和反序列化
本文链接:http://www.shufengxianlan.com/qtweb/news22/286072.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

猜你还喜欢下面的内容

做网站知识

分类信息网