C 序列化和反序列化 深度剖析

2021-05-22 00:53:13 字數 1565 閱讀 5126

c#序列化和反序列化程式都是基於工廠模式下的,那麼c#序列化和反序列化到底有什麼不同之處麼?那麼本文就向你詳細介紹c#序列化和反序列化程式的區別及其應用。

c#序列化和反序列化,兩者的程式處理方式基本一致,都是基於工廠模式的,所謂c#序列化就是是將物件轉換為容易傳輸的格式的過程,一般情況下轉化打流檔案,放入記憶體或者io檔案中。例如,可以序列化乙個物件,然後使用 http 通過 internet 在客戶端和伺服器之間傳輸該物件,或者和其它應用程式共享使用。相反的,反序列化根據流重新構造物件。.net自帶的有兩種序列化物件的方式,xml和binary的,xml 序列化不轉換方法、索引器、私有欄位或唯讀屬性(唯讀集合除外)。要序列化物件的所有欄位和屬性(公共的和私有的),請使用 binaryformatter,而不要使用 xml 序列化。

c#序列化和反序列化的例項應用剖析:

二進位制的c#序列化的方式:

例如我們有個物件:

需要序列化該物件,必須在給該類加上serializable的屬性,然後建立乙個序列化寫入的流:

filestream filestream = new filestream("temp.dat", filemode.create);

然後建立二進位制格式器:

binaryformatter b=new binaryformatter();

然後是序列化:

b.serialize(filestream,c);

然後關閉儲存流。(可以見下面的例子)

讀取乙個已經被序列化的物件的時候:操作方式一樣,只是

然後就可以讀取了,完整的例子是:

這就是自帶的序列化和反序列的操作,但是,很多情況下,乙個物件比較大,而且很多私有的屬性和方法我們不需要,例如在原型模式裡面序列化的話,只需要序列clone方法和一些屬性,私有的方法無需要,還例如在讀取大規模的io的時候,讀取操作完全不需要... 這時候就需要自己整合重寫序列的iserializable介面:

實現該介面需要兩個注意的,乙個就是建構函式,主要是為了反序列,另乙個就是getobjectdata,主要是執行序列化,例如我們現在有乙個employee類需要序列化

需要注意的是我這裡的noserialstring屬性前面有[nonserialized()],就是說預設並不序列化這個屬性,而是使用預設值 。

首先是建構函式:

然後是c#序列化方法,就是當寫入流的時候怎麼儲存的:

把上面兩個方法寫入到employee類,然後寫個測試的程式:

c#序列化和反序列化程式執行的結果是:

writing employee information  

reading employee information  

employee id: 10  

employee name: omkumar  

employee noserialstring: noserialstring-test 

看到employee noserialstring:屬性的值沒有,它保持預設值,沒有序列化。

c#序列化和反序列化的理解就向你介紹到這裡,希望對你了解和學習更重要的是對你使用c#序列化和反序列化有所幫助。

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

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

C 序列化和反序列化

binaryserialize serialize new binaryserialize book book serialize.deserialize book.write 3 測試用的 binaryserialize類 using system using system.collections...

C 序列化和反序列化

對stu類進行序列化和反序列化操作序列化所用到的stu類using system using system.collections.generic using system.linq using system.text public string stuname public int stuage ...