为什么要在Java的Serializable类中使用SerialVersionUID
序列化和SerialVersionUID始終是許多Java開發(fā)人員的難題。 我經常會看到類似此SerialVersionUID的問題,或者如果不在我的Serializable類中聲明SerialVersionUID會發(fā)生什么情況? 除了涉及到的復雜性和罕見的使用之外,這些問題的另一個原因是Eclipse IDE發(fā)出警告,警告不要缺少SerialVersionUID,例如“ Serializable類Customer不會聲明long類型的靜態(tài)最終SerialVersionUID字段” 。 在本文中,您不僅將學習Java SerialVersionUID的基礎知識,而且還將了解其在序列化和反序列化過程中的作用。 通過實現(xiàn)標記接口java.io.Serializable將一個類聲明為Serializable時,如果您尚未使用Externalizable接口自定義該過程,則Java運行時將使用默認的Serialization機制將該類的實例持久化到磁盤中。 在序列化過程中,Java運行時會為一個類創(chuàng)建一個版本號,以便以后可以反序列化它。 此版本號在Java中稱為SerialVersionUID 。 如果在反序列化過程中,SerialVersionUID不匹配,則過程將失敗,并在線程“ main” java.io.InvalidClassException中以InvalidClassException作為Exception ,同時還會打印類名和相應的SerialVersionUID。 解決此問題的快速解決方案是復制SerialVersionUID并將其聲明為類中的私有靜態(tài)最終長常量。 在本文中,我們將了解為什么要在Java中使用SerialVersionUID以及如何使用serialver JDK工具生成此ID。 如果您不熟悉序列化,還可以查看“ 十大Java序列化面試”問題,以評估您的知識并找到理解上的空白以供進一步閱讀。 與并發(fā)和多線程類似,序列化是另一個主題,值得一讀。
就像我說的那樣,當我們不聲明SerialVersionUID作為類中的靜態(tài),最終值和長整型值時,序列化機制會為我們創(chuàng)建它。 該機制對許多細節(jié)敏感,包括您的類中的字段,訪問修飾符,它們實現(xiàn)的接口,甚至不同的Compiler實現(xiàn),對類的任何更改或使用不同的編譯器都可能導致產生不同的SerialVersionUID ,許多最終都會停止重新加載序列化的數(shù)據(jù)。 依靠Java序列化機制生成此id太冒險了,這就是為什么建議在Serializable類中聲明顯式SerialVersionUID的原因。 我強烈建議閱讀Joshua Bloch的經典Java標題“ Effective Java”,以了解Java序列化和不正確處理它的問題。 順便說一下,JDK還提供了一個名為serialver的工具,位于我的機器C:\ Program Files \ Java \ jdk1.6.0_26 \ bin \ serialver.exe的JAVA_HOME文件夾的bin目錄中,該工具可用于為舊版本生成SerialVersionUID類。 如果您在類中進行了更改(這會破壞序列化并且您的應用程序無法重新加載序列化的實例),這將非常有用。 您可以簡單地使用此工具為舊實例創(chuàng)建SerialVersionUID,然后通過聲明一個private , static , final和long SerialVersionUID字段在類中顯式使用它。 順便說一句,出于性能和安全性的考慮,強烈建議您使用自定義二進制格式進行序列化,Effective Java再次提供了幾項,這詳細解釋了自定義格式的優(yōu)點。
您可以使用JDK的serialver工具為類生成SerialVersionUID。 這對于正在發(fā)展的類特別有用,它以易于復制的格式返回SerialVersionUID。 您可以使用serialver JDK工具,如以下示例所示:
$ serialver use: serialver [-classpath classpath] [-show] [classname...]$ serialver -classpath . Hello Class Hello is not Serializable.$ serialver -classpath . Hello Hello: static final long SerialVersionUID = -4862926644813433707L;您甚至可以通過運行命令$ serialver -show以GUI形式使用serialver工具,這將打開串行版本檢查器,該檢查器將使用完整的類名并顯示其串行版本。
現(xiàn)在我們知道什么是SerialVersionUID以及為什么在Serializable類中聲明它很重要,是時候修改一些與Java SerialVersionUID相關的重要事實了。
這就是Java中的SerialVersionUID的全部內容。 現(xiàn)在我們知道了為什么在類中聲明SerialVersionUID很重要。 您可以感謝您的IDE的提醒,這可能會破壞您的類的反序列化。
如果您想了解有關序列化和相關概念的更多信息,還可以看到以下精彩文章:
- Java中瞬時變量和易失變量之間的區(qū)別
- Java中Serializable和Externalizable接口之間的區(qū)別
- 何時在Java中使用瞬時變量
翻譯自: https://www.javacodegeeks.com/2014/05/why-use-serialversionuid-inside-serializable-class-in-java.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的为什么要在Java的Serializable类中使用SerialVersionUID的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用win10怎么设置无线路由器w10系统
- 下一篇: Java中的SynchronousQue