C 序列化與反序列化

2021-05-21 20:30:59 字數 3317 閱讀 1549

一、概述

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

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

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

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

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

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

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

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

三、.net提供了三種序列化方式

[1]、xml serializer

[2]、soap serializer

[3]、binaryserializer

四、基本序列化

要使乙個類可序列化,最簡單的方法是使用 serializable 屬性對它進行標記,如下所示:

[serializable] 

public class myobject 

[binaryserializer]

將此類的乙個例項序列化為乙個檔案: 

myobject obj = 

newmyobject(); 

obj.n1 = 1; 

obj.n2 = 

24; 

obj.str = 

"一些字串"

; iformatter formatter = 

newbinaryformatter(); 

stream stream = 

newfilestream(

"myfile.bin"

, filemode.create, 

fileaccess.write, fileshare.none); 

formatter.serialize(stream, obj); 

stream.close(); 

反序列化:

iformatter formatter = 

newbinaryformatter(); 

stream stream = 

newfilestream(

"myfile.bin"

, filemode.open, 

fileaccess.read, fileshare.read); 

myobject obj = (myobject) formatter.deserialize(fromstream); 

stream.close(); 

[xmlserializer]

將此類的例項序列化成乙個xml檔案.

xmlserializer ser = 

newxmlserializer(obj.gettype());

ser.serialize(

newfilestream(@"users.xml", filemode.create), obj);

反序列化:

xmlserializer serializer = 

newxmlserializer(type.gettype(

"myobject"

));myobject my=(myobject)serializer.deserialize(new filestream(@

"users.xml"

,filemode.open));

說明:使用二進位制格式化程式進行序列化。您只需建立乙個要使用的流和格式化程式的例項,然後呼叫格式化程式的 serialize 方法。流和要序列化的物件例項作為引數提供給此呼叫。類中的所有成員變數(甚至標記為 private 的變數)都將被序列化,但這一點在本例中未明確體現出來。在這一點上,二進位制序列化不同於只序列化公共欄位的 xml 序列化程式。將物件還原到它以前的狀態也非常容易。首先,建立格式化程式和流以進行讀取,然後讓格式化程式對物件進行反序列化。    

[soap serializer]

如果要求具有可移植性,請使用 soapformatter。所要做的更改只是將以上**中的binaryformatter換 soapformatter,而 serialize 和 deserialize 呼叫不變。

序列化和反序列化 C 序列化與反序列化。

序列化介紹 把物件用一種新的格式來表示。系列化只序列化資料。序列化不建議使用自動屬性 為什麼要序列化 將乙個複雜的物件轉換流,方便儲存與資訊交換。class program class person public int age 二進位制序列化 就是將物件變成流的過程,把物件變成byte class...

c 序列化 與 反序列化

gspring永春1 輸出截圖如下 也就是說採用xml序列化的方式只能儲存public的字段和可讀寫的屬性,對於private等型別的字段不能進行序列化 關於迴圈引用 比如在上面的例子book類中加入如下乙個屬性 public book relationbook 在呼叫序列化時使用如下方法 book...

C 序列化與反序列化

序列化,又稱序列化,是.net執行時環境用來支援使用者定義型別的流化的機制。序列化就是把乙個物件儲存到乙個檔案或資料庫欄位中去,反序列化就是在適當的時候把這個檔案再轉化成原來的物件使用。其目的是以某種儲存形成使自定義物件持久化,或者將這種物件從乙個地方傳輸到另乙個地方。net框架提供了兩種序列化的方...