C 物件序列化(3)

2022-03-24 10:03:44 字數 2676 閱讀 8403

編寫customserialize專案的form1.cs如如**7.27所示。

**7.27  自定義序列化:form1.cs

using system;

……………………………………………

//匯入必要的命名空間

using system.runtime.serialization.formatters.binary;

using system.runtime.serialization;

using system.io;

namespace customserialize

private void form1_load(object sender, eventargs e)

private void pathbtn_click(object sender, eventargs e)

private void serbtn_click(object sender, eventargs e)

private void deserbtn_click(object sender, eventargs e)

//捕捉並顯示檔案未找到異常

catch (filenotfoundexception ex)

", ex.message);

messagebox.show(str);

}}       

}[serializable]

//定義details類,實現iserializable介面

public class details : iserializable

set}

public string nickname

set}

public details()

//過載建構函式,接收兩個引數

private details(serializationinfo inputinfo, streamingcontext sc)

//實現iserializable介面的getobjectdata方法,接收兩個引數

void iserializable.getobjectdata(serializationinfo outputinfo, streamingcontext sc)

}}

程式執行後,除了text屬性為"檔案路徑"的容器(groupbox容器控制項)中的控制項外,窗體大部分控制項為不可用狀態。輸入檔名到該容器的文字框控制項中(即路徑為程式集當前目錄),結果如圖7.54所示。

單擊"確定路徑"按鈕後,窗體中其他控制項均為可用狀態,而text屬性為"檔案路徑"的容器中的控制項變為不可用狀態。接著在text屬性為"原始物件資料"的容器中的文字框控制項中,輸入2個字串值,並單擊"序列化"按鈕,結果如圖7.55所示。

首先程式建立details類的物件,並根據輸入值對該物件進行了初始化操作。然後將該物件進行序列化操作,自動呼叫details類中實現的getobjectdata()方法,修改字段值,並指定了相應的鍵值。在程式集所在的目錄下已經建立了boyname.dat檔案,在visual studio 2005/visual studio 2008中開啟"boyname.dat"檔案,如圖7.56所示。

從圖7.56中可看出,首先原始物件的字段資料進行成功的修改,_name字段值前面加上了"the boy's name is",_nickname字段值前面加上"the boy's nickname is"。其次,欄位的名稱沒有被持久化到dat檔案中,其對應鍵值分別被修改為"person name"和"person nickname"。最後,單擊"反序列化"按鈕,結果如圖7.57所示。

建立details類的新物件,其欄位資料和原始物件一致,這說明其過載建構函式的操作成功。details類的過載建構函式序列化時修改的部分進行了逆向操作,還原了原始物件的資料。

解析一般情況下,序列化的過程細節並不需要考慮,但是在開發程式時要對序列化的過程進行微操作,可以使用自定義序列化完成。常用的自定義序列化方法在定義可序列化的型別時,使之實現using system.runtime.serialization..iserializable介面,當實現該介面後,序列化該類物件的過程將自動呼叫該類實現的getobjectdata()方法,開發者所需的微操作可以定義在這個getobjectdata()方法中。相應地,在反序列化的過程中也可以對過程進行干預,反序列化是根據持久化的資料資訊重新建立該類的物件。實現iserializable介面的類將使用過載的建構函式建立新物件,可以將干預反序列化過程的**編寫在該類過載建構函式中,如以下**所示:

public class details : iserializable

//過載建構函式,接收兩個指定型別的引數

private details(serializationinfo inputinfo, streamingcontext sc)

//實現iserializable介面的getobjectdata方法,接收2個引數

void iserializable.getobjectdata(serializationinfo outputinfo, streamingcontext sc)

}

以上**中,過載建構函式必須接收指定型別的引數,而實現介面的getobjectdata()方法,呼叫outputinfo引數的addvalue()方法,即可對序列化過程的資料進行微操作。這個addvalue()方法有多個過載版本,這裡用於修改字段值。

C 物件序列化

1.序列化和反序列化 2.binaryformatter類有2個方法 1 void serialize stream stream,object graph 物件graph序列化到stream中 2 object deserialize stream stream 將物件從stream中反序列化,返...

C 序列化物件及反序列化

壓縮方法 region 壓縮 壓縮 未被壓縮的位元組資料 public static byte compress byte bytes 壓縮 未被壓縮的資料 public static byte compress object dataoriginal return compress bytes 壓...

物件序列化 反序列化

必須新增引用 using system.io using system.runtime.serialization using system.runtime.serialization.formatters.binary 方法 region 物件序列化 物件序列化 任意物件 字串 public st...