浅谈XML与对象的序列化与反序列化

这篇文章主要讲述XML与对象的序列化与反序列化。并且会附上一些简单的序列化与反序列化方法,供大家使用。

创新互联专注于企业全网整合营销推广、网站重做改版、阜平网站定制设计、自适应品牌网站建设、成都h5网站建设购物商城网站建设、集团公司官网建设、成都外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为阜平等各大城市提供网站开发制作服务。

假设我们在一个Web项目中有这样两个类

 
 
 
  1. public class Member   
  2. {  
  3.   public string Num { get; set; }  
  4.   public string Name { get; set; }  
  5. }  
  6. public class Team  
  7. {  
  8.    public  string Name;  
  9.    public  List Members { get; set; }  

假设我们需要把Team类的一个实例POST到一个URL,

当然,使用Form隐藏域提交就可以完成该功能。

如果该Team包括30条数据呢?

为了区分每个Member,我们得给参数的名字加上后缀。这就要一大串的隐藏域来完成:

 
 
 
  1. @model Team  
  2.  
  3.  
  4.  
  5.  
  6. ... 
  7.  
  8.  
  9.  
  10.  
  11.     document.getElementById("submitForm").submit();  
  12.  

还敢想象一下如果Team再复杂一些,嵌套再多一些的情况么?

呃,即使你愿意这么传数据,对方看到一坨参数名就够头疼了。

我们都知道对象是不能在网络中直接传输的,不过还有补救的办法。

XML(Extensible Markup Language)可扩展标记语言,本身就被设计用来存储数据,任何一个对象都可以用XML来描述。以Team类为例:

 
 
 
  1.  
  2.  
  3.   Development 
  4.    
  5.      
  6.       001 
  7.       Marry 
  8.      
  9.      
  10.       002 
  11.       John 
  12.      
  13.    
  14.  

   这样一个XML文档就表示了Team一个实例。

聪明的看官应该已经想到,XML是可以作为对象信息的载体在网络中传输,因为它是文本形式的。

怎么进行XML文档与对象的相互转换呢?

XmlSerializer类就是干这个活的。

      命名空间:System.Xml.Serialization

      程序集:System.Xml(在 system.xml.dll 中)

现在这里展示了一个提供序列化与反序列化方法的EncodeHelper类。

Deserialize方法将XML字符串转换为指定类型的对象;

Serialize方法则将对象转换为XML字符串。

 
 
 
  1. ///   
  2.  /// 提供xml文档序列化 反序列化  
  3.  ///   
  4.  public sealed class EncodeHelper  
  5.  {  
  6.      ///   
  7.      /// 反序列化XML字符串为指定类型  
  8.      ///   
  9.      public static object Deserialize(string Xml, Type ThisType)  
  10.      {  
  11.          XmlSerializer xmlSerializer = new XmlSerializer(ThisType);  
  12.          object result;  
  13.          try 
  14.          {  
  15.              using (StringReader stringReader = new StringReader(Xml))  
  16.              {  
  17.                  result = xmlSerializer.Deserialize(stringReader);  
  18.              }  
  19.          }  
  20.          catch (Exception innerException)  
  21.          {  
  22.              bool flag = false;  
  23.              if (Xml != null)  
  24.              {  
  25.                  if (Xml.StartsWith(Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble())))  
  26.                  {  
  27.                      flag = true;  
  28.                  }  
  29.              }  
  30.              throw new ApplicationException(string.Format("Couldn't parse XML: '{0}'; Contains BOM: {1}; Type: {2}.",                 Xml, flag, ThisType.FullName), innerException);  
  31.          }  
  32.          return result;  
  33.      }  
  34.  
  35.      ///   
  36.      /// 序列化object对象为XML字符串  
  37.      ///   
  38.      public static string Serialize(object ObjectToSerialize)  
  39.      {  
  40.          string result = null ;  
  41.          try 
  42.          {  
  43.          XmlSerializer xmlSerializer = new XmlSerializer(ObjectToSerialize.GetType());  
  44.            
  45.          using (MemoryStream memoryStream = new MemoryStream())  
  46.          {  
  47.              XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, new UTF8Encoding(false));  
  48.              xmlTextWriter.Formatting = Formatting.Indented;  
  49.              xmlSerializer.Serialize(xmlTextWriter, ObjectToSerialize);  
  50.              xmlTextWriter.Flush();  
  51.              xmlTextWriter.Close();  
  52.              UTF8Encoding uTF8Encoding = new UTF8Encoding(false, true);  
  53.              result= uTF8Encoding.GetString(memoryStream.ToArray());  
  54.          }  
  55.          }  
  56.          catch (Exception innerException)  
  57.          {  
  58.              throw new ApplicationException("Couldn't Serialize Object:" + ObjectToSerialize.GetType().Name, innerException);  
  59.          }  
  60.          return result;  
  61.      }  
  62.  } 

要使用这个类需要添加以下引用

 
 
 
  1.   using System;  
  2.   using System.Text;  
  3.   using System.IO;  
  4.   using System.Xml;  
  5.   using System.Xml.Serialization; 

下面我们用一个控制台程序来演示一下这个类是如何工作的。这里是程序的Main函数。

 
 
 
  1. static void Main(string[] args)  
  2.         {  
  3.             List Members = new List();  
  4.             Member member1 = new Member { Name = "Marry", Num = "001" };  
  5.             Member member2 = new Member { Name = "John", Num = "002" };  
  6.             Members.Add(member1);  
  7.             Members.Add(member2);  
  8.             Team team = new Team { Name = "Development", MembersMembers = Members };  
  9.             var xml =EncodeHelper.Serialize(team);//序列化  
  10.             Console.Write(xml);//打印序列化后的XML字符串  
  11.             Console.ReadLine();  
  12.             Team newTeam = EncodeHelper.Deserialize(xml, typeof(Team)) as Team;//反序列化时需要显式的进行类型转换  
  13.             Console.WriteLine("Team Name:"+newTeam.Name);//显示反序列化后的newTeam对象  
  14.             foreach (var member in newTeam.Members)  
  15.             {  
  16.                 Console.WriteLine("Member Num:" + member.Num);  
  17.                 Console.WriteLine("Member Name:" + member.Name);  
  18.             }  
  19.             Console.ReadLine();  
  20.         } 

在执行完Console.Write(xml)这行代码后,就可以看到打印出来的XML文档了。

 
 
 
  1.  
  2.  
  3.   Development 
  4.    
  5.      
  6.       001 
  7.       Marry 
  8.      
  9.      
  10.       002 
  11.       John 
  12.      
  13.    
  14.  

与我在文章开头给出的例子是一模一样的。

最终反序列化出来的newTeam对象打印出来是这样的结果。

Team Name:Development

Member Num:001

Member Name:Marry

Member Num:002

Member Name:John

回到我们开头的Web通信的例子,

利用XML序列化与反序列化来进行对象传递,我们只需要把需要传递的对象序列化为XML字符串,使用一个隐藏域进行form提交就可以搞定咯!

接收方再将接收到的XML字符串反序列化成预设的对象即可。前提是双方必须约定序列化与反序列化的过程一致,且对象相同。

最后我们来看一下怎么利用一些特性来控制序列化与反序列化操作的过程。我们把开始的类改一下:

 
 
 
  1. public class Member  
  2.     {  
  3.         [XmlElement("Member_Num")]  
  4.         public string Num { get; set; }  
  5.         public string Name { get; set; }  
  6.     }  
  7.     [XmlRoot("Our_Team")]  
  8.     public class Team  
  9.     {  
  10.         [NonSerialized]public string Name;修正于2012-4-13        
  11. [XmlIgnore]public string Name;  
  12.         public List Members { get; set; }  
  13.     }  
  14.    
  15.  
  16. public class Member  
  17.     {  
  18.         [XmlElement("Member_Num")]  
  19.         public string Num { get; set; }  
  20.         public string Name { get; set; }  
  21.     }  
  22.     [XmlRoot("Our_Team")]  
  23.     public class Team  
  24.     {  
  25.         [NonSerialized]public string Name;修正于2012-4-13        
  26. [XmlIgnore]public string Name;  
  27.         public List Members { get; set; }  
  28.     } 

然后我们再次执行刚才的控制台程序,序列化结果变成了这样:

 
 
 
  1.  
  2.  
  3.   Development修正于2012-4-13  
  4.    
  5.      
  6.       001 
  7.       Marry 
  8.      
  9.      
  10.       002 
  11.       John 
  12.      
  13.    
  14.  

本来的根节点Team变成了Our_Team,Member的子节点Num变成了Member_Num,并且Team的Name子节点被忽略了。

可见特性XmlRoot可以控制根节点的显示和操作过程,XmlElement则针对子节点。如果某些成员被标记XmlIgnore NonSerialized修正于2012-4-13特性,则在序列化与反序列化过程中会被忽略

本文标题:浅谈XML与对象的序列化与反序列化
网站网址:http://www.shufengxianlan.com/qtweb/news14/287714.html

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

广告

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