在編程中我們時(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)建:

需要注意,想要使用序列化器對這個(gè)類生成的對象序列化,需要在這個(gè)類上標(biāo)識一個(gè)特性 [ Serializable ]
[ Serializable ]:表示標(biāo)識的類是可以被序列化的。
接下來在 BinarySerialize 控制臺(tái)程序下,我們添加以下代碼:

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

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

而接下來的反序列化也沒有讓我們失望,成功的將文件流中的二進(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)行試一試。


上面兩張圖證明我們已經(jīng)成功的序列化以及反序列化除了這個(gè)對象,而生成的文件打開之后我們發(fā)現(xiàn),雖然不好閱讀,但是也能找到我們需要的數(shù)據(jù)。
XML序列化:對象序列化之后的結(jié)果是 XML形式的,通過 XmlSerializer 類來實(shí)現(xiàn)的,該類位于 System.Xml.Serialization 命名空間下。XML序列化不能序列化私有數(shù)據(jù)。

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


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