今天就跟大家聊聊有關(guān)Java中SerialVersionUID的作用是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
公司主營業(yè)務(wù):網(wǎng)站制作、成都做網(wǎng)站、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)建站是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)建站推出攀枝花免費(fèi)做網(wǎng)站回饋大家。
英文翻譯的意思是序列化版本號。凡是實(shí)現(xiàn)Serializable接口的類都會有一個(gè)表示序列化版本標(biāo)識符的靜態(tài)變量。
默認(rèn)的1L:比如:private static final long serialVersionUID = 1L; 。
根據(jù)類名、接口名、成員方法及屬性等來生成一個(gè)64位的哈希字段:
比如:
private static final long serialVersionUID = 3959055215634785113L;
當(dāng)定義一個(gè)實(shí)體類中如果沒有顯式的定義一個(gè)名為“serialVersionUID”、類型為long的變量時(shí),Java序列化機(jī)制會根據(jù)編譯時(shí)的class自動(dòng)生成一個(gè)serialVersionUID作為序列化版本比較,這種情況下,只有同一次編譯生成的class才會生成相同的serialVersionUID。比如,當(dāng)我們編寫一個(gè)Java類時(shí),隨著時(shí)間的推移,因?yàn)樾枨蟮母膭?dòng),需要在該Java類中添加新的的字段,這個(gè)時(shí)候再反序列化時(shí)就會出現(xiàn)serialVersionUID不一致的情況,從而導(dǎo)致反序列化失敗??梢酝ㄟ^在本地Java類中添加一個(gè)“serialVersionUID”變量,值保持不變,便可以進(jìn)行序列化和反序列化。如果Java類沒有顯示指定serialVersionUID,JVM會自動(dòng)生成一個(gè)。
序列化時(shí)為了保持版本的兼容性,即在版本升級時(shí)反序列化仍保持對象的唯一性。
當(dāng)實(shí)現(xiàn)java.io.Serializable接口的實(shí)體(類)沒有顯式地定義一個(gè)名為serialVersionUID,類型為long的變量時(shí),Java序列化機(jī)制會根據(jù)編譯的class自動(dòng)生成一個(gè)serialVersionUID作序列化版本比較用,這種情況下,只有同一次編譯生成的class才會生成相同的serialVersionUID 。如果我們不希望通過編譯來強(qiáng)制劃分軟件版本,即實(shí)現(xiàn)序列化接口的實(shí)體能夠兼容先前版本中未作更改的類,就需要顯式地定義一個(gè)名為serialVersionUID,類型為long的變量,不修改這個(gè)變量值的序列化實(shí)體都可以相互進(jìn)行串行化和反串行化。
記住應(yīng)該總是在可序列化的類中包含這個(gè)字段,即使是在第一個(gè)類版本中,以便提醒自己這個(gè)字段的重要性。不要在未來的版本中改變這個(gè)字段值,除非你有意要改變類使其與舊的序列化對象不兼容。
如果你的類序列化到硬盤上面后,你更改了類別的field(增加或減少或改名),當(dāng)你反序列化時(shí),就會出現(xiàn)異常的,這樣就會造成不兼容性的問題。但當(dāng)serialVersionUID相同時(shí),它就會將不一樣的field以type的預(yù)設(shè)值Deserialize,這個(gè)可以避開不兼容性的問題。
當(dāng)我們的系統(tǒng)不太經(jīng)常需要序列化類時(shí),可以去掉這些警告,做如下設(shè)置:Window-->Preferences-->Java,將serializable class without serialVersionUID的設(shè)置由warning改為Ignore。然后Eclipse會重新編譯程序,那些警告信息也就消失了。但如果在開發(fā)大量需要序列化的類的時(shí)候,建議還原為原來的設(shè)置。這樣可以保證系統(tǒng)的性能和健壯。
看完上述內(nèi)容,你們對Java中SerialVersionUID的作用是什么有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。