C 中關於類的序列化

2021-08-21 03:30:24 字數 2579 閱讀 8703

1.什麼是序列化

序列化是將物件狀態轉換為可保持或傳輸的格式的過程,在序列化過程中,物件的公共欄位和私有字段以及類的名稱(包括包含該類的程式集)都被轉換為位元組流,然後寫入資料流。與序列化相對的是反序列化,它將流轉換為物件。這兩個過程結合起來,可以輕鬆地儲存和傳輸資料。

2.為什麼使用序列化

乙個原因是將物件的狀態保持在儲存**中,以便可以在以後重新建立精確的副本。

我們經常需要將物件的字段值儲存到磁碟中,並在以後檢索此資料。儘管不使用序列化也能完成這項工作,但這種方法通常很繁瑣而且容易出錯,並且在需要跟蹤物件的層次結構時,會變得越來越複雜。可以想象一下編寫包含大量物件的大型業務應用程式的情形,程式設計師不得不為每乙個物件編寫**,以便將字段和屬性儲存至磁碟以及從磁碟還原這些欄位和屬性。序列化提供了輕鬆實現這個目標的快捷方法。

另乙個原因是通過值將物件從乙個應用程式域傳送到另乙個應用程式域中。

例如,序列化可用於在 asp.net 中儲存會話狀態並將物件複製到 windows 窗體的剪貼簿中。遠端處理還可以使用序列化通過值將物件從乙個應用程式域傳遞到另乙個應用程式域中。

公共語言執行時 (clr) 管理物件在記憶體中的分布,.net 框架則通過使用反射提供自動的序列化機制。物件序列化後,類的名稱、程式集以及類例項的所有資料成員均被寫入儲存**中。物件通常用成員變數來儲存對其他例項的引用。類序列化後,序列化引擎將跟蹤所有已序列化的引用物件,以確保同一物件不被序列化多次。.net 框架所提供的序列化體系結構可以自動正確處理物件圖表和迴圈引用。對物件圖表的唯一要求是,由正在進行序列化的物件所引用的所有物件都必須標記為 serializable(請參閱基本序列化)。否則,當序列化程式試圖序列化未標記的物件時將會出現異常。

當反序列化已序列化的類時,將重新建立該類,並自動還原所有資料成員的值。

(序列化技術的主要兩個目的是:持久化儲存、按值封送。)

3.如何實現物件的序列化及反序列化

要實現物件的序列化,首先要保證該物件可以序列化。而且,序列化只是將物件的屬性進行有效的儲存,對於物件的一些方法則無法實現序列化的。  

實現乙個類可序列化的最簡便的方法就是增加serializable屬性標記類。

即可實現該類的可序列化。注意序列化的類必須為public,否則不能夠被序列化。

要將該類的例項序列化為到檔案中 .net framework提供了三種方法:

xml序列化

新增system.runtime.serialization.formatters.binary命名空間;

二進位制序列化

新增system.xml.serialization命名空間;

noserialized屬性被xmllgnore屬性替代;

soap序列化

典型應用:web service.

4.實現自定義序列化

如果你對資料流的組織方式不完全滿意,那麼可以通過在自定義類中實現介面iserializable來自定義序列化,這個介面只有乙個方法:getobjectdata,這個方法用於將對類物件進行序列化所需要的資料填進serializationinfo物件。

另外還需提供乙個格式化構造器,這個構造器的引數列表與getobjectdata相同,並且要宣告為私有的。這個格式化器的作用是構造serializationinfo物件,然後在序列化時呼叫getobjectdata。

示例如下:

using

system;

using

system.data;

using

system.configuration;

using

system.web;

using

system.web.security;

using

system.web.ui;

using

system.web.ui.webcontrols;

using

system.web.ui.webcontrols.webparts;

using

system.web.ui.htmlcontrols;

using

system.runtime.serialization;

using

system.runtime.serialization.formatters.binary;

/**/

///﹤summary﹥

///employee 的摘要說明

///﹤/summary﹥

[serializable]

public

class

employee:iserializable

private

employee(serializationinfo info, streamingcontext ctxt)

public

void

getobjectdata(serializationinfo info, streamingcontext ctxt)

}

c#序列化和反序列化方法:

public

void

otheremployeeclasstest()

C 中類的序列化和反序列化

說明 本文演示將類序列化後寫入記事本並從記事本讀取反序列化為物件 1.首先建立乙個類,同時類必須標識為serializable,如下 serializable public class region public string region id public string region name ...

C 類的序列化和反序列化

在很多通訊或者資料儲存的過程中,都需要序列化和反序列化的過程。在c 中,如果想要進行自定義類的序列化,只需要簡單地在定義類的時候新增serializable標籤即可。如 serializable publicclassperson 經常用到的序列化方式有兩種 二進位制和xml,分為由system.r...

C 中對類的序列化和反序列化操作

序列化和反序列化操作 作用 實現不借助資料庫持久化的儲存資料。實現步驟 1.匯入命名空間 using system.io io 流實現檔案的讀寫 using system.runtime.serialization.formatters.binary 進行二進位制轉換操作 2.建立乙個封裝的實體類 ...