2012-07-04 30 views
1

在實現Serializable接口時,在Java中,我們需要設置它的長度爲serialVersionUID關於Java的可序列化,需要澄清

是否有任何區別是否應該選擇默認或自動生成長?

什麼時候應該比另一個更受歡迎?

如果自動生成long選擇,是否應該在事件類中更改?換句話說,賦值給serialVersionUID的值是與當前的類結構以及在那裏聲明的字段和方法有關的嗎?

private static final long serialVersionUID = 1L; 
private static final long serialVersionUID = 6749067740891125834L; 
+0

[什麼是serialVersionUID,爲什麼要使用它?](http://stackoverflow.com/questions/285793/what-is-a-serialversionuid-and-why-should-i-use-它) – paulsm4

+0

可能重複的[爲什麼生成long serialVersionUID而不是簡單的1L?](http://stackoverflow.com/questions/888335/why-generate-long-serialversionuid-instead-of-a-simple-1l) – Thilo

+0

使用默認序列號的兩個缺點:1)依賴於編譯器和版本。如果您嘗試反序列化到不同的環境,自動編號可能會隨機「中斷」。 2)你得到那些惱人的警告:)只需使用「1L」和fugghedabouddit;) – paulsm4

回答

1

串行版本UID可以是任意數字,它的值沒有特定的含義。

它是有道理的,並且用1啓動它很方便,並且每次格式改變時增加它。

但是,如果您從一開始就想到它,您只能這樣做。如果您已經擁有需要繼續讀取的現有數據,則此數據將具有自動生成的ID。在這種情況下,你別無選擇,只能匹配那個值。

+0

根本沒有任何意義可以改變它。所有這些都是打破所有現有的序列化。你應該做的是向後彎曲以保持它們兼容,在Object Versioning規則下,通過編寫customt序列化方法serialFields等。 – EJP

2

默認和自動生成的long之間的主要區別是自動生成的串行版本UID基於對象的字段。如果您保留了沒有版本ID的對象的副本,那麼使用生成的版本可以幫助確保與已保存的對象的兼容性。正因爲如此,我傾向於使用生成的版本。無論哪種情況,如果發生不兼容的更改,則需要更新版本ID。

http://docs.oracle.com/javase/1.5.0/docs/guide/serialization/spec/version.html第5.6.1和5.6.2節描述了哪些更改是兼容的,以及哪些更改會打破序列化。