溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Java中SerialVersionUID的作用是什么

發(fā)布時(shí)間:2021-06-15 11:02:07 來(lái)源:億速云 閱讀:257 作者:Leah 欄目:編程語(yǔ)言

今天就跟大家聊聊有關(guān)Java中SerialVersionUID的作用是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

1.serialVersionUID概念介紹

英文翻譯的意思是序列化版本號(hào)。凡是實(shí)現(xiàn)Serializable接口的類(lèi)都會(huì)有一個(gè)表示序列化版本標(biāo)識(shí)符的靜態(tài)變量。

2.serialVersionUID的生成方式

默認(rèn)的1L:比如:private static final long serialVersionUID = 1L; 。

根據(jù)類(lèi)名、接口名、成員方法及屬性等來(lái)生成一個(gè)64位的哈希字段:

比如:

private static final long serialVersionUID = 3959055215634785113L;

3.serialVersionUID原理

當(dāng)定義一個(gè)實(shí)體類(lèi)中如果沒(méi)有顯式的定義一個(gè)名為“serialVersionUID”、類(lèi)型為long的變量時(shí),Java序列化機(jī)制會(huì)根據(jù)編譯時(shí)的class自動(dòng)生成一個(gè)serialVersionUID作為序列化版本比較,這種情況下,只有同一次編譯生成的class才會(huì)生成相同的serialVersionUID。比如,當(dāng)我們編寫(xiě)一個(gè)Java類(lèi)時(shí),隨著時(shí)間的推移,因?yàn)樾枨蟮母膭?dòng),需要在該Java類(lèi)中添加新的的字段,這個(gè)時(shí)候再反序列化時(shí)就會(huì)出現(xiàn)serialVersionUID不一致的情況,從而導(dǎo)致反序列化失敗??梢酝ㄟ^(guò)在本地Java類(lèi)中添加一個(gè)“serialVersionUID”變量,值保持不變,便可以進(jìn)行序列化和反序列化。如果Java類(lèi)沒(méi)有顯示指定serialVersionUID,JVM會(huì)自動(dòng)生成一個(gè)。

4、serialVersionUID作用

序列化時(shí)為了保持版本的兼容性,即在版本升級(jí)時(shí)反序列化仍保持對(duì)象的唯一性。

5、serialVersionUID注意事項(xiàng)

  • 當(dāng)實(shí)現(xiàn)java.io.Serializable接口的實(shí)體(類(lèi))沒(méi)有顯式地定義一個(gè)名為serialVersionUID,類(lèi)型為long的變量時(shí),Java序列化機(jī)制會(huì)根據(jù)編譯的class自動(dòng)生成一個(gè)serialVersionUID作序列化版本比較用,這種情況下,只有同一次編譯生成的class才會(huì)生成相同的serialVersionUID  。如果我們不希望通過(guò)編譯來(lái)強(qiáng)制劃分軟件版本,即實(shí)現(xiàn)序列化接口的實(shí)體能夠兼容先前版本中未作更改的類(lèi),就需要顯式地定義一個(gè)名為serialVersionUID,類(lèi)型為long的變量,不修改這個(gè)變量值的序列化實(shí)體都可以相互進(jìn)行串行化和反串行化。

  • 記住應(yīng)該總是在可序列化的類(lèi)中包含這個(gè)字段,即使是在第一個(gè)類(lèi)版本中,以便提醒自己這個(gè)字段的重要性。不要在未來(lái)的版本中改變這個(gè)字段值,除非你有意要改變類(lèi)使其與舊的序列化對(duì)象不兼容。

  • 如果你的類(lèi)序列化到硬盤(pán)上面后,你更改了類(lèi)別的field(增加或減少或改名),當(dāng)你反序列化時(shí),就會(huì)出現(xiàn)異常的,這樣就會(huì)造成不兼容性的問(wèn)題。但當(dāng)serialVersionUID相同時(shí),它就會(huì)將不一樣的field以type的預(yù)設(shè)值Deserialize,這個(gè)可以避開(kāi)不兼容性的問(wèn)題。

  • 當(dāng)我們的系統(tǒng)不太經(jīng)常需要序列化類(lèi)時(shí),可以去掉這些警告,做如下設(shè)置:Window-->Preferences-->Java,將serializable  class without  serialVersionUID的設(shè)置由warning改為Ignore。然后Eclipse會(huì)重新編譯程序,那些警告信息也就消失了。但如果在開(kāi)發(fā)大量需要序列化的類(lèi)的時(shí)候,建議還原為原來(lái)的設(shè)置。這樣可以保證系統(tǒng)的性能和健壯。

看完上述內(nèi)容,你們對(duì)Java中SerialVersionUID的作用是什么有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI