C 序列化與反序列化學習

2021-06-18 04:44:10 字數 3694 閱讀 9274

最近為了換乙份新工作,準備了不少筆試題。從筆試當中自己發現了不少基礎知識的盲點。很慶幸這樣的機會,可以讓自己對於基礎知識的理解又上公升乙個台階。此文介紹c#裡面的序列化與反序列化的知識,如果你是大鳥,請口下留情。

首先,什麼是序列化與反序列化呢?

序列化就是將物件的狀態資訊轉換為可以儲存或傳輸形式的過程。其實就是將物件持久化,比如說把物件儲存為二進位制或者是xml的方式。可以將物件序列到流、磁碟、記憶體和網路等等。相反,反序列化則是將儲存或傳輸形式轉換為物件的過程。

那麼,運用序列化的好處又是什麼呢?

(1)以某種儲存形式(二進位制或者是xml等)使物件持久化。序列化和反序列化用來儲存記憶體中的資料,它不是c#中獨有的技術,比如win7的休眠就是該技術的應用,在c#程式中可以用來儲存物件,和物件當前狀態,下次開啟時通過反序列化獲得,一般用在伺服器啟動(反序列化)和關閉(序列化)時儲存資料。

(2)使物件的傳遞更加容易,比如你用ajax向伺服器請求資訊,伺服器可以直接將model物件通過序列化來輸出json字串,也可以通過反序列化將你傳過去的json字串組裝成物件,就免去了拼字串和解析字串的過程。

最後,在.net裡面怎麼實現序列化技術?

(1)二進位制序列化保持型別保真度,這對於在應用程式的不同呼叫之間保留物件的狀態很有用。例如,通過將物件序列化到剪貼簿,可在不同的應用程式之間共享物件。您可以將物件序列化到流、磁碟、記憶體和網路等等。

(2) xml 序列化僅序列化公共屬性和字段,且不保持型別保真度。當您要提供或使用資料而不限制使用該資料的應用程式時,這一點是很有用的。由於 xml 是乙個開放式標準,因此,對於通過 web 共享資料而言,這是乙個很好的選擇。soap 同樣是乙個開放式標準,這使它也成為乙個頗具吸引力的選擇。----------以上內容摘自百科的內容與的內容.

關於這兩點的概念,我自己也不大明白是什麼意思?

保持型別保真度,一開始我是認為是成員變數的型別,以為用xml序列化的話,都會變成是string的型別,但是發現根本不是這樣。成員變數的型別都能儲存,那這裡說的型別保真類到底是指什麼?xml序列化僅序列化公共屬性和字段,但是我用私有字段,發現也一樣可以序列化。我是定義乙個私有字段,然後通過公共屬性來給它賦值,然後在反序列化裡面通過公共屬性來取私有欄位的內容,發現是可以的,不知道是不是我的理解有什麼問題?

1#針對二進位制序列化與反序列化,.net是使用binaryformatter物件來進行序列化與反序列化。

一般的實現方法,是把可序列化的類用特徵類[serializable]來標誌,當然,不想序列類的成員,可以用[nonserialized]特徵類來標誌。類裡面的所有成員變數都能被序列化。然後例項化命名空間system.runtime.serialization.formatters.binary下的binaryformatter物件,借助其serialize

方法來實現序列化與deserialize

方法來實現反序列化。

結果為:

其實你如果進到datafile.dat檔案的話,你會發現用記事本,寫字板來開啟的話,都是會出現亂碼。因為它是用二進位制的方式來儲存的,所以你只有是在用二進位制的方式下才能看到裡面的內容。不過對於我們來說,即使看到二進位制的內容,我們也不大可能知道是什麼意思。所以可能只有通過反序列化的方式來讀出文件的內容。

2#針對xml序列化與反序列化,.net提供了兩種方式來實現。

其一:使用xmlserializer類將物件序列化到xml文件中和從xml文件反序列化出物件。

與第1點的區別,摘自寒江笠博文:

(i)不使用[serializable]特徵類與[nonserializable]特徵類,只使用特徵類[system.xml.serialization.xmlignoreattribute] 來標誌哪些成員變數不需要被序列化。

(ii)不能序列化私有成員變數(不確定,因為我試過可以

(iii)要求被序列化的類要有乙個預設的建構函式(不確定,不知道這裡的建構函式是為了什麼而需要的

console.writeline("反序列化nonserialized結果:" + serializeobject.notserialize);}}

結果:

其二:使用soapformatter類將物件序列化到xml文件中和從xml文件反序列化出物件。

同樣是序列化到xml文件裡面,只不過序列化裡面包含了soap特有的額外資訊。

soapformatter 和 binaryformatter 兩個類實現 iremotingformatter 介面以支援遠端過程呼叫 (rpc),實現 iformatter 介面(由 iremotingformatter 繼承)以支援物件圖形的序列化。soapformatter 類還支援對 isoapmessage 物件進行 rpc,而不必使用 iremotingformatter 功能。此概念來自msdn

文件,有興趣去研讀詳細內容。

其二的方法跟第一點(1#)的實現方法基本一樣,畢竟都是實現相同的介面,有一定的共性,只是最終儲存的格式或者是傳輸的方式不一樣。

using system;using system.io;using system.collections;using system.runtime.serialization;

結果為:

xmlns:xsd=

xmlns:soap-enc=

xmlns:soap-env=

xmlns:clr=

soap-env:encodingstyle=""

>

< soap-env:body>

< a1:serializeobject id="ref-1" xmlns:a1=""

>

< _x003c_id_x003e_k__backingfield>1

< _x003c_username_x003e_k__backingfieldid="ref-3">csdbfans

< _x003c_password_x003e_k__backingfieldhref="#ref-3"/>

< /a1:serializeobject>

< /soap-env:body>

< /soap-env:envelope>

這裡使用寒江笠博文

來進行兩種技術的對比:

二進位制序列化的優點:

(1)所有的類成員變數(包括唯讀的)都可以被序列化;

(2)效能非常好。

xml序列化的優點:

(1)互操作性好;

(2)不需要嚴格的二進位制依賴;

(3)可讀性強。

,謝謝!

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

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

C 序列化與反序列化

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

c 序列化 與 反序列化

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