2011-08-25 131 views
18

可能重複:
Why should I bother about serialVersionUID?什麼是java中的serialVersionUID,通常在異常類中?

我會通過一些異常處理代碼,我看到名爲serialVersionUID的東西。這個uid是什麼?它僅限於例外還是可以在所有類中使用?這個ID的優點是什麼?

+5

請參閱這裏:http://stackoverflow.com/questions/285793/why-should-i-bother-about-serialversionuid –

+3

這是一個很好的,制定良好的問題恕我直言,但它已被回答(主要)在上面的鏈接中。至於是否僅限於'Exception',答案是否定的,它可以用於任何類。 –

+0

在例外我們沒有可序列化...那麼爲什麼它有? – amod

回答

23

的serialVersionUID是一個字段定義特定類的版本,而seriializing & deseriializing ..考慮,你有一個類Employee其中有3場以來一直在生產了一段時間的場景(這意味着有可能存在許多連載版本的員工對象),當你更新類包含(比如說第4個字段),那麼所有以前的類(它們都是序列化的)不能被鑄造或反序列化到新的&,你會得到一個例外..

爲了避免這個問題,可以使用serialVersionUID字段告訴JVM新類實際上是不同版本的(通過更改serialVersionUID)。

@Farmor & @湯姆傑弗里斯說了幾乎相同的事情,但有一個例子,事情看起來很簡單。

+0

很好解釋。示例中爲+1。 –

2

它以確定他們是否有序列化和deserializable兼容性,如果他們有相同的serialVersionUID和兩個工具Serializable那麼他們是兼容的。

它並不僅限於例外情況,因爲您會注意到如果實現了Serializable,eclipse很容易在早期的普通Java類中放置serialVersionUID

已修改:已更新爲包含有關Serializable界面的@Spychos正確評論。

+0

這不是嚴格正確的。如果一個對象或它的一個超類實現了可序列化,則這個對象是可序列化的。 – Spycho