C 物件序列化(1)

2022-03-24 10:03:49 字數 3279 閱讀 5605

物件序列化在應聘過程中並不常見,但是在實際應用中卻是很常見的。本節將列舉3個比較典型的問題,以擴充.net的相關知識面。

面試例題20:編寫物件序列化的程式。

考點:掌握物件序列化的基本方法,理解序列化中不同格式的區別。

出現頻率:★★★

解答在visual studio 2005/visual studio 2008中建立乙個c#的windows窗體應用程式專案,並將其專案命名為multiserialize。程式使用5個"textbox"控制項分別接受使用者的輸入,其中上面4個控制項用於傳遞相應的值給某個物件,而下面的"textbox"控制項用於儲存檔名。當使用者單擊"textbox"操作下面的3個按鈕控制項中任意乙個時,程式將根據使用者輸入值初始化一組物件,並將物件圖進行相應格式的序列化。在visual studio 2005/ visual studio 2008的"form1.cs[設計]"檢視中建立基本的窗體布局和控制項,控制項的命名如圖7.43所示。

圖7.43  物件序列化窗體控制項的布局及命名

在編寫**前,先引用system.runtime.serialization. formatters.soap.dll程式集,即單擊visual studio 2005/ visual studio 2008選單欄的"專案|新增引用"命令,在".net"選項卡中找到所需要的程式集,單擊"確定"按鈕,即完成了外部程式集的引用操作,結果如圖7.44所示。

圖7.44  引用外部程式集

分別雙擊form1的3個按鈕控制項,編寫相應的"click"事件處理方法。multiserialize專案的form1.cs如**7.25所示。

**7.25  序列化物件:form1.cs

using system;

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

//匯入必要的命名空間

using system.xml.serialization;

using system.runtime.serialization.formatters.binary;

using system.runtime.serialization.formatters.soap;

using system.runtime.serialization;

using system.io;

namespace multiserialize

private void xmlbtn_click(object sender, eventargs e)

);//建立stream型別引用fs,並傳遞fn作路徑引數

stream fs = new filestream(fn, filemode.create, fileaccess.write, fileshare.none);

//呼叫xs的serialize方法,傳遞fs和pn引數

xs.serialize(fs, pn);

//關閉fs物件

fs.close();

//輸出成功資訊

messagebox.show(success);

}private void binbtn_click(object sender, eventargs e)

private void soapbtn_click(object sender, eventargs e)

//定義useiformatter方法,接收乙個iformatter型別引數

void useiformatter(iformatter fmt, string success)

}//定義personname類,並標記可序列化特性

[serializable]

public class personname

//過載建構函式,接收4個string型別引數

public personname(string n,string nn, string p, string m)

}//定義personother類,並標記可序列化特性

[serializable]

public class personother

set}

public string message

set}

public personother() }}

程式執行時,可以向前4個"textbox"控制項填入某人的基本資料,然後在name屬性為"filename"控制項中填入"person.dat",即輸出檔案的檔名,執行結果如圖7.45所示。

當使用者單擊"二進位制格式"按鈕後,程式將根據使用者輸入的值建立並初始化1個personname類的物件。程式使用二進位制格式序列化該物件並輸出到程式集相同目錄下的person.dat檔案中,當完成了這些工作,程式將使用資訊對話方塊提示序列化操作成功,執行結果如圖7.46所示。

圖7.45  輸入多個資訊

在圖7.47中,編譯完成的multiserialize程式集相同目錄下已經建立了person.dat檔案,並且程式也跳出了資訊對話方塊,並提示操作成功。如果按下"soap格式"按鈕或"xml格式"按鈕,其執行結果是相似的,但是建議其生成檔案的副檔名應分別修改為對應的"soap"和"xml"。假設使用者已經生成了3種不同格式的檔案,物件資料通過序列化操作持久化到檔案中了。用visual studio 2005/visual studio 2008開啟"person.dat"檔案如圖7.47所示。

其中中文部分無法正常顯示,但是數字是可以正常顯示,這是因為name屬性中"pwd"的控制項的值是數字(即圖中的"1900")。在程式執行時填入英文,同樣可以正常顯示。從"person.dat"檔案的內容中可以看出,二進位制格式儲存了比較完整的物件資訊,如所屬程式集,程式集版本等資訊,有利於以後還原物件資料。用visual studio 2005/visual studio 2008開啟"person.soap"檔案,結果如圖7.48所示。

從圖7.48中可看到_nickname欄位並沒有被持久化,因為該字段在person類中定義時標記了[nonserialized]特性,即不可序列化。相應地,用visual studio 2005/ visual studio 2008開啟"person.xml"檔案,結果如圖7.49所示

說明:專案所生成的程式集路徑為"專案路徑\bin\debug"。

如果修改程式的**,可知二進位制格式序列化的檔案除了儲存程式集的資訊,還儲存私有欄位及公共欄位的資料soap格式和xml格式僅儲存物件的公共欄位及公共屬性,但是這兩種格式可以應用於更大範圍的平台、應用程式框架中。並且xml格式所序列化的物件資料報含了被標記為[nonserialized]特性的字段。

說明:本題程式採用iformatter介面實現多型的應用,使二進位制格式化和soap格式化操作重用了部分的**。程式中使用iformatter介面必須匯入其命名空間,即system.runtime.serialization。

C 物件序列化(1)

c 物件序列化 1 物件序列化在應聘過程中並不常見,但是在實際應用中卻是很常見的。本節將列舉3個比較典型的問題,以擴充.net的相關知識面。面試例題20 編寫物件序列化的程式。考點 掌握物件序列化的基本方法,理解序列化中不同格式的區別。出現頻率 解答在visual studio 2005 visua...

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 壓...