西西軟件下載最安全的下載網(wǎng)站、值得信賴(lài)的軟件下載站!

首頁(yè)編程開(kāi)發(fā)C#.NET → C#中的序列化和反序列化是什么、有什么作用、使用方法詳解

C#中的序列化和反序列化是什么、有什么作用、使用方法詳解

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:西西整理時(shí)間:2012/11/21 8:35:26字體大小:A-A+

作者:西西點(diǎn)擊:0次評(píng)論:0次標(biāo)簽: 序列化

什么是序列化與反序列化???

序列化和反序列化,我們可能經(jīng)常會(huì)聽(tīng)到,其實(shí)通俗一點(diǎn)的解釋?zhuān)蛄谢褪前岩粋(gè)對(duì)象保存到一個(gè)文件或數(shù)據(jù)庫(kù)字段中去,反序列化就是在適當(dāng)?shù)臅r(shí)候把這個(gè)文件再轉(zhuǎn)化成原來(lái)的對(duì)象使用。

 當(dāng)兩個(gè)進(jìn)程在進(jìn)行遠(yuǎn)程通信時(shí),彼此可以發(fā)送各種類(lèi)型的數(shù)據(jù)。無(wú)論是何種類(lèi)型的數(shù)據(jù),都會(huì)以二進(jìn)制序列的形式在網(wǎng)絡(luò)上傳送。發(fā)送方需要把這個(gè)對(duì)象轉(zhuǎn)換為字節(jié)序列,才能在網(wǎng)絡(luò)上傳送;接收方則需要把字節(jié)序列再恢復(fù)為對(duì)象。
  把對(duì)象轉(zhuǎn)換為字節(jié)序列的過(guò)程稱(chēng)為對(duì)象的序列化。
  把字節(jié)序列恢復(fù)為對(duì)象的過(guò)程稱(chēng)為對(duì)象的反序列化。

對(duì)象的序列化主要有兩種用途:
  1) 把對(duì)象的字節(jié)序列永久地保存到硬盤(pán)上,通常存放在一個(gè)文件中;
  我們經(jīng)常需要將對(duì)象的字段值保存到磁盤(pán)中,并在以后檢索此數(shù)據(jù)。盡管不使用序列化也能完成這項(xiàng)工作,但這種方法通常很繁瑣而且容易出錯(cuò),并且在需要跟蹤對(duì)象的層次結(jié)構(gòu)時(shí),會(huì)變得越來(lái)越復(fù)雜。可以想象一下編寫(xiě)包含大量對(duì)象的大型業(yè)務(wù)應(yīng)用程序的情形,程序員不得不為每一個(gè)對(duì)象編寫(xiě)代碼,以便將字段和屬性保存至磁盤(pán)以及從磁 盤(pán)還原這些字段和屬性。序列化提供了輕松實(shí)現(xiàn)這個(gè)目標(biāo)的快捷方法。公共語(yǔ)言運(yùn)行時(shí) (CLR) 管理對(duì)象在內(nèi)存中的分布,.NET 框架則通過(guò)使用反射提供自動(dòng)的序列化機(jī)制。對(duì)象序列化后,類(lèi)的名稱(chēng)、程序集以及類(lèi)實(shí)例的所有數(shù)據(jù)成員均被寫(xiě)入存儲(chǔ)媒體中。對(duì)象通常用成員變量來(lái)存儲(chǔ)對(duì)其他實(shí)例的引用。類(lèi)序列化后,序列化引擎將跟蹤所有已序列化的引用對(duì)象,以確保同一對(duì)象不被序列化多次。.NET 框架所提供的序列化體系結(jié)構(gòu)可以自動(dòng)正確處理對(duì)象圖表和循環(huán)引用。對(duì)對(duì)象圖表的唯一要求是,由正在進(jìn)行序列化的對(duì)象所引用的所有對(duì)象都必須標(biāo)記為 Serializable(請(qǐng)參閱基 本序列化)。否則,當(dāng)序列化程序試圖序列化未標(biāo)記的對(duì)象時(shí)將會(huì)出現(xiàn)異常。當(dāng)反序列化已序列化的類(lèi)時(shí),將重新創(chuàng)建該類(lèi),并自動(dòng)還原所有數(shù)據(jù)成員的值。

  2) 在網(wǎng)絡(luò)上傳送對(duì)象的字節(jié)序列。
  對(duì)象僅在創(chuàng)建對(duì)象的應(yīng)用程序域中有效。除非對(duì)象是從MarshalByRefObject派生得到或標(biāo)記為 Serializable,否則,任何將對(duì)象作為參數(shù)傳遞或?qū)⑵渥鳛榻Y(jié)果返回的嘗試都將失敗。如果對(duì)象標(biāo)記為 Serializable,則該對(duì)象將被自動(dòng)序列化,并從一個(gè)應(yīng)用程序域傳輸至另一個(gè)應(yīng)用程序域,然后進(jìn)行反序列化,從而在第二個(gè)應(yīng)用程序域中產(chǎn)生出該對(duì)象的一個(gè)精確副本。此過(guò)程通常稱(chēng)為按值封送。如果對(duì)象是從MarshalByRefObject派生得到,則從一個(gè)應(yīng)用程序域傳遞至另一個(gè)應(yīng)用程序域的是對(duì)象引用,而不是對(duì)象本身。也可以將從MarshalByRefObject派生得到的對(duì)象標(biāo)記為Serializable。遠(yuǎn)程使用此對(duì)象時(shí),負(fù)責(zé)進(jìn)行序列化并已預(yù)先配置為SurrogateSelector的格式化程序?qū)⒖刂菩蛄谢^(guò)程,并用一個(gè)代理替換所有從MarshalByRefObject派生得到的對(duì)象。如果沒(méi)有預(yù)先配置為SurrogateSelector,序列化體系結(jié)構(gòu)將遵從下面的標(biāo)準(zhǔn)序列化規(guī)則.

序列化和反序列化的主要作用有:

  1、在進(jìn)程下次啟動(dòng)時(shí)讀取上次保存的對(duì)象的信息

  2、在不同的AppDomain或進(jìn)程之間傳遞數(shù)據(jù)

  3、在分布式應(yīng)用系統(tǒng)中傳遞數(shù)據(jù)

  .............

常見(jiàn)的序列化的方法:

  1、BinaryFormatter

  2、SoapFormatter

  3、XML序列化

用法:

  BinaryFormatter的用法大致如下:  

//BinaryFormatter將對(duì)象序列化到文件中
List<string> inputList = new List<string>() { "潮流時(shí)尚公子","http://gz168168.taobao.com","歡迎專(zhuān)注技術(shù)的程序袁來(lái)看看筆者的網(wǎng)店哦"};
using (FileStream fsWriter = new FileStream(@"gz168168.tmp",FileMode.Create,FileAccess.Write))
{
       BinaryFormatter bf = new BinaryFormatter();
       //序列化
       bf.Serialize(fsWriter, inputList);
}

//BinaryFormatter將文件中的數(shù)據(jù)反序列化出來(lái)
List<string> outputList = new List<string>();
using (FileStream fsReader = new FileStream(@"gz168168.tmp",FileMode.Open,FileAccess.Read))
{
       BinaryFormatter bf = new BinaryFormatter();
       //反序列化
       outputList = (List<string>)bf.Deserialize(fsReader);
}

  XML序列化的用法大致如下: 

//xml序列化到test.xml文件中
List<string> inputList = new List<string>() { "潮流時(shí)尚公子","http://gz168168.taobao.com"};
using (FileStream fsWriter = new FileStream(@"test.xml",FileMode.Create,FileAccess.Write))
{
      XmlSerializer xs = new XmlSerializer(typeof(List<string>));
      xs.Serialize(fsWriter, inputList);
}

//從test.xml文件中反序列化出來(lái)
List<string> outputList = new List<string>();
using (FileStream fsReader = new FileStream(@"test.xml",FileMode.Open,FileAccess.Read))
{
     XmlSerializer xs = new XmlSerializer(typeof(List<string>));
     outputList = xs.Deserialize(fsReader) as List<string>;
}

總結(jié):

兩個(gè)的用法大致如下:

序列化:

  1.得到一個(gè)存儲(chǔ)對(duì)象的類(lèi)型

  2.創(chuàng)建一個(gè)寫(xiě)入文件流

  3.定義要序列化的類(lèi)型

  4.調(diào)用序列化方法

反序列化:

  1.定義一個(gè)裝載對(duì)象的類(lèi)型

  2.創(chuàng)建一個(gè)讀出文件流

  3.定義要反序列化的類(lèi)型

  4.調(diào)用反序列化方法

BinaryFormatter類(lèi)進(jìn)行序列化和反序列化,以縮略型二進(jìn)制格式寫(xiě)到一個(gè)文件中去,速度比較快,而且寫(xiě)入后的文件已二進(jìn)制保存有一定的保密效果。標(biāo)記為NonSerialized的其他所有成員都能序列化。

采用xml序列化的方式只能保存public的字段和可讀寫(xiě)的屬性,對(duì)于private等類(lèi)型的字段不能進(jìn)行序列化。

二進(jìn)制序列化的優(yōu)點(diǎn): 

  1. 所有的類(lèi)成員(包括只讀的)都可以被序列化;

  2. 性能非常好。

XML序列化的優(yōu)點(diǎn):

  1. 互操作性好;

  2. 不需要嚴(yán)格的二進(jìn)制依賴(lài);

  3. 可讀性強(qiáng)

SoapFormatter微軟淘汰了,,不能序列化泛型,這里就不多講了。

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀圍觀
    • 2 無(wú)聊無(wú)聊

    熱門(mén)評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱(chēng):
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)