c 中xml序列化 和binary 序列化

2021-07-04 10:56:23 字數 2940 閱讀 4059

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

序列化和反序列化,我們可能經常會聽到,其實通俗一點的解釋,序列化就是把乙個物件儲存到乙個檔案或資料庫欄位中去,反序列化就是在適當的時候把這個檔案再轉化成原來的物件使用。

當兩個程序在進行遠端通訊時,彼此可以傳送各種型別的資料。無論是何種型別的資料,都會以二進位制序列的形式在網路上傳送。傳送方需要把這個物件轉換為位元組序列,才能在網路上傳送;接收方則需要把位元組序列再恢復為物件。

把物件轉換為位元組序列的過程稱為物件的序列化。

把位元組序列恢復為物件的過程稱為物件的反序列化。

物件的序列化主要有兩種用途:

1) 把物件的位元組序列永久地儲存到硬碟上,通常存放在乙個檔案中;

我們經常需要將物件的字段值儲存到磁碟中,並在以後檢索此資料。儘管不使用序列化也能完成這項工作,但這種方法通常很繁瑣而且容易出錯,並且在需要跟蹤物件的層次結構時,會變得越來越複雜。可以想象一下編寫包含大量物件的大型業務應用程式的情形,程式設計師不得不為每乙個物件編寫**,以便將字段和屬性儲存至磁碟以及從磁 盤還原這些欄位和屬性。序列化提供了輕鬆實現這個目標的快捷方法。公共語言執行時 (clr) 管理物件在記憶體中的分布,.net 框架則通過使用反射提供自動的序列化機制。物件序列化後,類的名稱、程式集以及類例項的所有資料成員均被寫入儲存**中。物件通常用成員變數來儲存對其他例項的引用。類序列化後,序列化引擎將跟蹤所有已序列化的引用物件,以確保同一物件不被序列化多次。.net 框架所提供的序列化體系結構可以自動正確處理物件圖表和迴圈引用。對物件圖表的唯一要求是,由正在進行序列化的物件所引用的所有物件都必須標記為 serializable(請參閱基 本序列化)。否則,當序列化程式試圖序列化未標記的物件時將會出現異常。當反序列化已序列化的類時,將重新建立該類,並自動還原所有資料成員的值。

2) 在網路上傳送物件的位元組序列。

物件僅在建立物件的應用程式域中有效。除非物件是從marshalbyrefobject派生得到或標記為 serializable,否則,任何將物件作為引數傳遞或將其作為結果返回的嘗試都將失敗。如果物件標記為 serializable,則該物件將被自動序列化,並從乙個應用程式域傳輸至另乙個應用程式域,然後進行反序列化,從而在第二個應用程式域中產生出該物件的乙個精確副本。此過程通常稱為按值封送。如果物件是從marshalbyrefobject派生得到,則從乙個應用程式域傳遞至另乙個應用程式域的是物件引用,而不是物件本身。也可以將從marshalbyrefobject派生得到的物件標記為serializable。遠端使用此物件時,負責進行序列化並已預先配置為surrogateselector的格式化程式將控制序列化過程,並用乙個**替換所有從marshalbyrefobject派生得到的物件。如果沒有預先配置為surrogateselector,序列化體系結構將遵從下面的標準序列化規則.

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

1、在程序下次啟動時讀取上次儲存的物件的資訊

3、在分布式應用系統中傳遞資料

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

常見的序列化的方法:

1、binaryformatter

2、soapformatter

3、xml序列化

用法:binaryformatter的用法大致如下:  

//binaryformatter將物件序列化到檔案中

listinputlist = new list() ;

using (filestream fswriter = new filestream(@"gz168168.tmp",filemode.create,fileaccess.write))

//binaryformatter將檔案中的資料反序列化出來

listoutputlist = new list();

using (filestream fsreader = new filestream(@"gz168168.tmp",filemode.open,fileaccess.read))

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

//xml序列化到test.xml檔案中

listinputlist = new list() ;

using (filestream fswriter = new filestream(@"test.xml",filemode.create,fileaccess.write))

//從test.xml檔案中反序列化出來

listoutputlist = new list();

using (filestream fsreader = new filestream(@"test.xml",filemode.open,fileaccess.read))

總結:

兩個的用法大致如下:

序列化:

1.得到乙個儲存物件的型別

2.建立乙個寫入檔案流

3.定義要序列化的型別

4.呼叫序列化方法

反序列化:

1.定義乙個裝載物件的型別

2.建立乙個讀出檔案流

3.定義要反序列化的型別

4.呼叫反序列化方法

binaryformatter類進行序列化和反序列化,以縮略型二進位制格式寫到乙個檔案中去,速度比較快,而且寫入後的檔案已二進位制儲存有一定的保密效果。標記為nonserialized的其他所有成員都能序列化。

採用xml序列化的方式只能儲存public的字段和可讀寫的屬性,對於private等型別的字段不能進行序列化。

二進位制序列化的優點:

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

2. 效能非常好。

xml序列化的優點:

1. 互操作性好;

2. 不需要嚴格的二進位制依賴;

3. 可讀性強

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

binary序列化與反序列化

效能一般,使用簡單,適合定長的資料,例如bool,int8,uint8,int16,float32,complex64,或者陣列 包含定長成員變數的結構體。有效能需求建議使用protocol buffer 效能比較 protocol buffer binary gob json 序列化var n u...

C 中XML序列化和反序列化初探

c 中xml序列化和反序列化初探 這裡是乙個 demo 簡單實現了 c 中物件的 xml序列化技術。首先,我們定義乙個需要序列化的物件 usingsystem namespace xmlserializer 然後我們就可以在程式中使用這個類構造物件,對其序列化到xml文件。private void ...

Xml序列化和反序列化

1.xmlserializer 類 該類用一種高度鬆散耦合的方式提供序列化服務。你的類不需要繼承特別的基類,而且它們也不需要實現特別的介面。相反,你只需在你的類或者這些類的公共域以及讀 寫屬性裡加上自定義的特性。xmlserializer 通過反射機制讀取這些特性並用它們將你的類和類成員對映到 xm...