日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
淺談XML與對象的序列化與反序列化

這篇文章主要講述XML與對象的序列化與反序列化。并且會附上一些簡單的序列化與反序列化方法,供大家使用。

創(chuàng)新互聯(lián)專注于企業(yè)全網(wǎng)整合營銷推廣、網(wǎng)站重做改版、阜平網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)、購物商城網(wǎng)站建設(shè)、集團公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為阜平等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

假設(shè)我們在一個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; }  

假設(shè)我們需要把Team類的一個實例POST到一個URL,

當(dāng)然,使用Form隱藏域提交就可以完成該功能。

如果該Team包括30條數(shù)據(jù)呢?

為了區(qū)分每個Member,我們得給參數(shù)的名字加上后綴。這就要一大串的隱藏域來完成:

 
 
 
  1. @model Team  
  2.  
  3.  
  4.  
  5.  
  6. ... 
  7.  
  8.  
  9.  
  10.  

還敢想象一下如果Team再復(fù)雜一些,嵌套再多一些的情況么?

呃,即使你愿意這么傳數(shù)據(jù),對方看到一坨參數(shù)名就夠頭疼了。

我們都知道對象是不能在網(wǎng)絡(luò)中直接傳輸?shù)?,不過還有補救的辦法。

XML(Extensible Markup Language)可擴展標(biāo)記語言,本身就被設(shè)計用來存儲數(shù)據(jù),任何一個對象都可以用XML來描述。以Team類為例:

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

   這樣一個XML文檔就表示了Team一個實例。

聰明的看官應(yīng)該已經(jīng)想到,XML是可以作為對象信息的載體在網(wǎng)絡(luò)中傳輸,因為它是文本形式的。

怎么進行XML文檔與對象的相互轉(zhuǎn)換呢?

XmlSerializer類就是干這個活的。

      命名空間:System.Xml.Serialization

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

現(xiàn)在這里展示了一個提供序列化與反序列化方法的EncodeHelper類。

Deserialize方法將XML字符串轉(zhuǎn)換為指定類型的對象;

Serialize方法則將對象轉(zhuǎn)換為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函數(shù)。

 
 
 
  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;//反序列化時需要顯式的進行類型轉(zhuǎn)換  
  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.         } 

在執(zhí)行完Console.Write(xml)這行代碼后,就可以看到打印出來的XML文檔了。

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

與我在文章開頭給出的例子是一模一樣的。

最終反序列化出來的newTeam對象打印出來是這樣的結(jié)果。

Team Name:Development

Member Num:001

Member Name:Marry

Member Num:002

Member Name:John

回到我們開頭的Web通信的例子,

利用XML序列化與反序列化來進行對象傳遞,我們只需要把需要傳遞的對象序列化為XML字符串,使用一個隱藏域進行form提交就可以搞定咯!

接收方再將接收到的XML字符串反序列化成預(yù)設(shè)的對象即可。前提是雙方必須約定序列化與反序列化的過程一致,且對象相同。

最后我們來看一下怎么利用一些特性來控制序列化與反序列化操作的過程。我們把開始的類改一下:

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

然后我們再次執(zhí)行剛才的控制臺程序,序列化結(jié)果變成了這樣:

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

本來的根節(jié)點Team變成了Our_Team,Member的子節(jié)點Num變成了Member_Num,并且Team的Name子節(jié)點被忽略了。

可見特性XmlRoot可以控制根節(jié)點的顯示和操作過程,XmlElement則針對子節(jié)點。如果某些成員被標(biāo)記XmlIgnore NonSerialized修正于2012-4-13特性,則在序列化與反序列化過程中會被忽略


分享名稱:淺談XML與對象的序列化與反序列化
文章鏈接:http://www.dlmjj.cn/article/copocig.html