如何解析java對(duì)象序列化與反序列化原理

如何解析java對(duì)象序列化與反序列化原理,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

站在用戶(hù)的角度思考問(wèn)題,與客戶(hù)深入溝通,找到靜樂(lè)網(wǎng)站設(shè)計(jì)與靜樂(lè)網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶(hù)體驗(yàn)好的作品,建站類(lèi)型包括:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋靜樂(lè)地區(qū)。

這篇文章主要介紹了java對(duì)象序列化與反序列化原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

一、序列化和反序列化的概念

對(duì)象轉(zhuǎn)換為字節(jié)序列的過(guò)程稱(chēng)為對(duì)象的序列化。把字節(jié)序列恢復(fù)為對(duì)象的過(guò)程稱(chēng)為對(duì)象的反序列化。

二、序列化和反序列化的作用

對(duì)象的序列化主要有兩種用途:

把對(duì)象的字節(jié)序列永久地保存到硬盤(pán)上,通常存放在一個(gè)文件中。  在網(wǎng)絡(luò)上傳送對(duì)象的字節(jié)序列。網(wǎng)絡(luò)上傳輸?shù)亩际嵌M(jìn)制序列。

在很多應(yīng)用中,需要對(duì)某些對(duì)象進(jìn)行序列化,讓它們離開(kāi)內(nèi)存空間,存到物理硬盤(pán),以便長(zhǎng)期保存。比如最常見(jiàn)的是Web服務(wù)器中的Session對(duì)象,當(dāng)有10萬(wàn)用戶(hù)并發(fā)訪(fǎng)問(wèn),就有可能出現(xiàn)10萬(wàn)個(gè)Session對(duì)象,內(nèi)存可能吃不消,于是Web容器就會(huì)把一些seesion先序列化到硬盤(pán)中,等要用了再把保存在硬盤(pán)中的對(duì)象還原到內(nèi)存中。

當(dāng)兩個(gè)進(jìn)程在進(jìn)行遠(yuǎn)程通信時(shí),彼此可以發(fā)送各種類(lèi)型的數(shù)據(jù)。無(wú)論是何種類(lèi)型的數(shù)據(jù),都會(huì)以二進(jìn)制序列的形式在網(wǎng)絡(luò)上傳送。

發(fā)送方需要把這個(gè)Java對(duì)象轉(zhuǎn)換為字節(jié)序列,才能在網(wǎng)絡(luò)上傳送;接收方則需要把字節(jié)序列再恢復(fù)為Java對(duì)象。

三、JDK類(lèi)庫(kù)中的序列化API

java.io.ObjectOutputStream代表對(duì)象輸出流,它的writeObject(Object obj)方法可把指定的obj對(duì)象進(jìn)行序列化,把得到的字節(jié)序列寫(xiě)到一個(gè)目標(biāo)輸出流中。

java.io.ObjectInputStream代表對(duì)象輸入流,它的readObject()方法從一個(gè)源輸入流中讀取字節(jié)序列,再把它們反序列化為一個(gè)對(duì)象,并將其返回。

只有實(shí)現(xiàn)了Serializable和Externalizable接口的類(lèi)的對(duì)象才能被序列化。Externalizable接口繼承自 Serializable接口,實(shí)現(xiàn)Externalizable接口的類(lèi)完全由自身來(lái)控制序列化的行為,而僅實(shí)現(xiàn)Serializable接口的類(lèi)可以 采用默認(rèn)的序列化方式 。

對(duì)象序列化包括如下步驟:

1) 創(chuàng)建一個(gè)對(duì)象輸出流,它可以包裝一個(gè)其他類(lèi)型的目標(biāo)輸出流,如文件輸出流;

2) 通過(guò)對(duì)象輸出流的writeObject()方法寫(xiě)對(duì)象。

對(duì)象反序列化的步驟如下:

1) 創(chuàng)建一個(gè)對(duì)象輸入流,它可以包裝一個(gè)其他類(lèi)型的源輸入流,如文件輸入流;

2) 通過(guò)對(duì)象輸入流的readObject()方法讀取對(duì)象。

四、serialVersionUID的作用

serialVersionUID: 字面意思上是序列化的版本號(hào),凡是實(shí)現(xiàn)Serializable接口的類(lèi)都有一個(gè)表示序列化版本標(biāo)識(shí)符的靜態(tài)變量。實(shí)現(xiàn)Serializable接口的類(lèi)如果類(lèi)中沒(méi)有添加serialVersionUID,則會(huì)報(bào)一個(gè)警告。

serialVersionUID有兩種生成方式:

采用img這種方式生成的serialVersionUID是1L,例如:

1 private static final long serialVersionUID = 1L;

采用img這種方式生成的serialVersionUID是根據(jù)類(lèi)名,接口名,方法和屬性等來(lái)生成的,例如:

1 private static final long serialVersionUID = 4603642343377807741L;

serialVersionUID 這個(gè)序列化版本號(hào)的作用就是當(dāng)有修改的時(shí)候,會(huì)兼容之前的版本內(nèi)容,因?yàn)樾薷那昂蟮膕erialVersionUID 是一樣的,如果修改前后的序列化版本號(hào)不同,則會(huì)反序列化失敗。也就是說(shuō)當(dāng)我們自己去指定了serialVersionUID,就可以保證在這么多類(lèi)中,這個(gè)編號(hào)是唯一的。這樣我們就可以在序列化后,去修改之前的類(lèi),例如添加屬性字段,或者新增一個(gè)方法而不會(huì)影響到后期的還原,還原后的對(duì)象照樣可以使用,而且還多了方法或者屬性可以用。

五、serialVersionUID的取值

serialVersionUID的取值是Java運(yùn)行時(shí)環(huán)境根據(jù)類(lèi)的內(nèi)部細(xì)節(jié)自動(dòng)生成的。如果對(duì)類(lèi)的源代碼作了修改,再重新編譯,新生成的類(lèi)文件的serialVersionUID的取值有可能也會(huì)發(fā)生變化。

類(lèi)的serialVersionUID的默認(rèn)值完全依賴(lài)于Java編譯器的實(shí)現(xiàn),對(duì)于同一個(gè)類(lèi),用不同的Java編譯器編譯,有可能會(huì)導(dǎo)致不同的 serialVersionUID,也有可能相同。為了提高serialVersionUID的獨(dú)立性和確定性,強(qiáng)烈建議在一個(gè)可序列化類(lèi)中顯示的定義serialVersionUID,為它賦予明確的值。

顯式地定義serialVersionUID有兩種用途:

在某些場(chǎng)合,希望類(lèi)的不同版本對(duì)序列化兼容,因此需要確保類(lèi)的不同版本具有相同的serialVersionUID;

在某些場(chǎng)合,不希望類(lèi)的不同版本對(duì)序列化兼容,因此需要確保類(lèi)的不同版本具有不同的serialVersionUID。

六、總結(jié)

序列化是將對(duì)象進(jìn)行序列化,目的是方便存儲(chǔ)和在網(wǎng)絡(luò)中進(jìn)行傳輸。

但是需要注意的是序列化保存的是對(duì)象的狀態(tài),靜態(tài)變量屬于類(lèi)的狀態(tài),因此 序列化并不保存靜態(tài)變量。

如果不想某個(gè)變量被序列化,則可以在該變量前加上Transient 關(guān)鍵字。

Transient 關(guān)鍵字的作用是控制變量的序列化,在變量聲明前加上該關(guān)鍵字,可以阻止該變量被序列化到文件中,在被反序列化后,transient 變量的值被設(shè)為初始值,如 int 型的是 0,對(duì)象型的是 null。

看完上述內(nèi)容,你們掌握如何解析java對(duì)象序列化與反序列化原理的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

當(dāng)前標(biāo)題:如何解析java對(duì)象序列化與反序列化原理
文章網(wǎng)址:http://muchs.cn/article16/phoegg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)手機(jī)網(wǎng)站建設(shè)、動(dòng)態(tài)網(wǎng)站、做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名