中文字幕视频在线看,亚洲精品无码久久久久av老牛,亚洲精品无码av片,亚洲av影院一区二区三区,亚洲国产精品成人久久久

serialversionuid=1L的作用(DLCODE使用說明)

相信不少人在Java的類文件里見過private static final long serialVersionUID = 1L; ,但是很多人卻不清楚這個(gè)字段的用處,那這個(gè)字段到底有什么用呢?

在談這個(gè)字段的作用前,我們先來聊一聊Java中對(duì)象的序列化。

什么是對(duì)象序列化?

序列化:把對(duì)象轉(zhuǎn)化為可傳輸?shù)淖止?jié)序列過程稱為序列化。

反序列化:把字節(jié)序列還原為對(duì)象的過程稱為反序列化。

對(duì)象序列化有什么作用?

假如服務(wù)端與客戶端進(jìn)行通信,然后服務(wù)端想要把一個(gè)對(duì)象的數(shù)據(jù)返回給客戶端,在網(wǎng)絡(luò)IO只能傳輸字節(jié)的情況下,客戶端怎樣才能接受到這個(gè)對(duì)象的正確數(shù)據(jù)呢?答案是序列化,將對(duì)象序列化后再進(jìn)行傳輸,假如沒有序列化,直接將對(duì)象轉(zhuǎn)成字節(jié)數(shù)組直接傳輸,那么客戶端收到數(shù)據(jù)后就無法正確地將數(shù)據(jù)還原成對(duì)象。

而序列化就是一種規(guī)則,就是一種可以讓對(duì)象按照一定的規(guī)則轉(zhuǎn)成字節(jié)數(shù)組,而使得字節(jié)數(shù)組能夠在進(jìn)行網(wǎng)絡(luò)傳輸或者跨平臺(tái)存儲(chǔ)后能夠?qū)⒆止?jié)數(shù)據(jù)反序列化還原回正確的對(duì)象。

目前對(duì)象序列化最常見的方式有JSON、XML、Hessian等,還有Java語(yǔ)言原生的序列化方式Serializable。

JSON序列化和Serializable區(qū)別

JSON

JSON 是一種輕量級(jí)的數(shù)據(jù)交換格式。 JSON 序列化就是將數(shù)據(jù)對(duì)象轉(zhuǎn)換為 JSON 字符串。在序列化過程中拋棄了類型信息,所以反序列化時(shí)只有提供類型信息才能準(zhǔn)確地反序列化。相比于其他的序列化方式,JSON 可讀性和兼容性比較好,較為方便調(diào)試,但此方式常常成為黑客的攻擊點(diǎn),攻擊者巧妙地利用反序列化過程構(gòu)造惡意代碼,使得程序在反序列化的過程中執(zhí)行任意代碼,比如最近業(yè)內(nèi)傳出FastJson漏洞 ,就是利用了此方式的序列化/反序列化導(dǎo)致的。

Serializable

Serializable是Java語(yǔ)言特有的序列化方式,它是一個(gè)序列化接口,java類可以通過實(shí)現(xiàn)Serializable接口來實(shí)現(xiàn)該類對(duì)象的序列化,這個(gè)接口非常特殊,沒有任何方法,只起標(biāo)識(shí)作用,Java序列化保留了對(duì)象類的元數(shù)據(jù)(如類、成員變量、繼承類信息等),以及對(duì)象數(shù)據(jù)等,兼容性最好,但不支持跨語(yǔ)言,而且性能一般。

serialVersionUID作用

serialVersionUID其實(shí)是Java原生的Serializable序列化中的一個(gè)功能,其最本質(zhì)的作用是記錄一個(gè)對(duì)象的版本號(hào),使得對(duì)象能夠兼容同一個(gè)版本號(hào)的不同特性。如果實(shí)現(xiàn)了Serializable接口的類沒有顯示定義serialVersionUID,那么JDK編譯時(shí)會(huì)根據(jù)屬性隱式生成一個(gè)對(duì)應(yīng)的serialVersionUID,當(dāng)這個(gè)類發(fā)生屬性修改變動(dòng)時(shí),其隱式的serialVersionUID會(huì)對(duì)應(yīng)發(fā)生改變,所以當(dāng)實(shí)現(xiàn)Serializable接口的類,建議顯示地聲明serialVersionUID字段定義版本號(hào),使得對(duì)象序列化兼容性更好。下面以代碼為例看看serialVersionUID是如何在對(duì)象的序列化和反序列化中發(fā)揮兼容作用的!

不聲明serialVersionUID

我們定義一個(gè)Student類先定義name和age兩個(gè)屬性,并實(shí)現(xiàn)Serializable接口,不顯示聲明serialVersionUID字段,然后通過序列化創(chuàng)建一個(gè)對(duì)象保存到F盤下的一個(gè)temp.txt文件中:

serialversionuid=1L的作用(DLCODE使用說明)

運(yùn)行上圖代碼在F盤下生成了一個(gè)temp.txt文件,里面保存有一個(gè)name為小明,age為18的Student對(duì)象。

然后我們先在Student里再加個(gè)sex屬性,再將上面代碼保存的在temp.txt里面的對(duì)象數(shù)據(jù)反序列化成對(duì)象:

serialversionuid=1L的作用(DLCODE使用說明)

運(yùn)行添加sex屬性后的反序列化代碼,發(fā)現(xiàn)直接拋出了異常
java.io.InvalidClassException,并明顯提示到serialVersionUID版本號(hào)不一致:

serialversionuid=1L的作用(DLCODE使用說明)

顯示聲明serialVersionUID

我們?cè)亠@示聲明serialVersionUID字段后,并定義一個(gè)版本號(hào)后,再將上面的代碼流程跑一遍:

serialversionuid=1L的作用(DLCODE使用說明)

serialversionuid=1L的作用(DLCODE使用說明)

代碼運(yùn)行成功,成功地從F盤下的temp.txt文件中的對(duì)象反序列化成對(duì)象,并且沒有出現(xiàn)不聲明serialVersionUID字段時(shí)拋出的InvalidClassException異常。

serialVersionUID這個(gè)字段就是用來定義某個(gè)對(duì)象文件的版本號(hào),同版本號(hào)時(shí)才能序列化/反序列化成功,無論是否對(duì)類屬性進(jìn)行了增刪改,也會(huì)成功!反之,假如版本號(hào)不一致,哪怕屬性完全一致,也會(huì)拋出異常,反序列化失??!

總結(jié)

serialVersionUID主使Java的Serializable接口的序列化/反序列化兼容問題,如果你的類實(shí)現(xiàn)的Serializable接口,建議一定要加上serialVersionUID這個(gè)字段顯示聲明版本號(hào),要不然在一些接口調(diào)用或者RPC傳輸時(shí),假如你哪天給這個(gè)類增加某個(gè)屬性,使得隱式的serialVersionUID版本號(hào)不一致了,并且這個(gè)功能之前在某個(gè)陰暗的小角落還保存著序列化的對(duì)象時(shí),哪天線上直接爆出反序列化異常失敗了,你的領(lǐng)導(dǎo)肯定會(huì)口吐芬芳地夸贊你一番。

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至2705686032@qq.com 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。原文轉(zhuǎn)載: 原文出處:

(0)
尊云-小張的頭像尊云-小張
上一篇 2024 年 6 月 15 日 09:08
下一篇 2024 年 6 月 16 日 09:07

相關(guān)推薦

發(fā)表回復(fù)

登錄后才能評(píng)論

聯(lián)系我們

400-900-3935

在線咨詢: QQ交談

郵件:cong@zun.com

工作時(shí)間:365天無休服務(wù) 24小時(shí)在線

添加微信