進(jìn)階之路—序列化及反序列化二進(jìn)制、Soap、XML篇

在編程中我們時(shí)常聽到序列化和反序列化這兩個(gè)詞,但是對于一些剛?cè)腴T的新手來講,序列化和反序列化是什么東西,又不得而知,其實(shí)序列化和反序列化并沒有我們相像的那么復(fù)雜和困難。舉個(gè)例子:

序列化反序列化圖解

上圖應(yīng)該很清晰了,假如我們在傳輸?shù)倪^程中,想要把一個(gè)實(shí)體對象 A 傳給 b 這臺(tái)機(jī)器,但是傳送的管道過小,沒辦法將 A整體傳過去,那么我們先將 A 打碎,然后傳過去之后在進(jìn)行重組,打碎的過程就叫做序列化,重組的過程就叫做反序列化。

序列化和反序列化在 C# 中可以通過多種方式實(shí)現(xiàn),格式不同,生成的文件大小也各不相同,當(dāng)前比較流行的格式有以下幾種:Soap, XML , Json , 二進(jìn)制。接下來我們就一起探究一下以上幾種格式序列化的方法以及優(yōu)劣性。

首先是二進(jìn)序列化的方式:對象序列化之后是二進(jìn)制格式的,通過 BinaryFormatter 類實(shí)現(xiàn),該類位于 System.Runtime.Serialization.Formatters.Binary 命名空間下。

我們新建一個(gè)空的解決方案,在解決方案中分別填加以下控制臺(tái)程序:BinarySerialize ,JsonSerialize ,SoapSerialize ,XmlSerialize 以及 Model 類庫。

程序目錄

首先進(jìn)行 Model 中實(shí)體對象的創(chuàng)建:

實(shí)體對象創(chuàng)建

需要注意,想要使用序列化器對這個(gè)類生成的對象序列化,需要在這個(gè)類上標(biāo)識一個(gè)特性 [ Serializable ]

[ Serializable ]:表示標(biāo)識的類是可以被序列化的。

接下來在 BinarySerialize 控制臺(tái)程序下,我們添加以下代碼:

二進(jìn)制序列化反序列化的代碼

以上代碼中,我們通過讀寫流的方式,在電腦D盤創(chuàng)建了一個(gè)文件,并將序列化之后的對象傳入到該文件中去,之后又將文件中的二進(jìn)制內(nèi)容取出反序列化成一個(gè)對象實(shí)體。

生成的文件和序列化后的二進(jìn)制片段

我們可以看到,這樣序列化就成功了,因?yàn)槭嵌M(jìn)制的格式,所以很難讀懂。

反序列化生成的實(shí)體對象

而接下來的反序列化也沒有讓我們失望,成功的將文件流中的二進(jìn)制片段轉(zhuǎn)換成了實(shí)體對象。

Soap 序列化器進(jìn)行序列化:對象序列化之后的結(jié)果符合 Soap 協(xié)議,也就是可以通過 Soap 協(xié)議傳輸,通過 System.Runtime.Serialization.Formatters.Soap 命名空間下的 SoapFormatte r類來實(shí)現(xiàn)的。

以下是 Soap 序列化的后臺(tái)代碼:

可以看出,跟二進(jìn)制的代碼基本是一樣的,區(qū)別在于調(diào)用的序列化器不同并且需要注意的是 Soap 序列化器不支持序列化泛型所以要在實(shí)體對象后后面 toArray() 一下,將其裝換成數(shù)組。接下來我們運(yùn)行試一試。

生成的文件以及soap片段
反序列化出來的對象

上面兩張圖證明我們已經(jīng)成功的序列化以及反序列化除了這個(gè)對象,而生成的文件打開之后我們發(fā)現(xiàn),雖然不好閱讀,但是也能找到我們需要的數(shù)據(jù)。

XML序列化:對象序列化之后的結(jié)果是 XML形式的,通過 XmlSerializer 類來實(shí)現(xiàn)的,該類位于 System.Xml.Serialization 命名空間下。XML序列化不能序列化私有數(shù)據(jù)。

xml序列化的后臺(tái)代碼

上面 XML 序列化的代碼與二進(jìn)制和 Soap 的相差不大,除了序列化器名稱不一樣之外還需注意的是, XML 序列化器在創(chuàng)建的時(shí)候需要給其指定對象類型。

序列化成功創(chuàng)建的文件
反序列化后的對象

上面兩張圖證明了我們代碼是可以成功運(yùn)行的,而且 XML 格式的文件可讀性要比另外兩種好的太多了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容