2014-09-12 128 views
0

作爲每docs爲什麼jvm生成serialVersionUID?

序列化運行時相關聯,每個序列化類版本號,稱爲的serialVersionUID,其被反序列化過程用於驗證序列化對象的發送者和接收者都加載的類該對象這與序列化相關。

如果的serialVersionUID只是爲了驗證序列化對象的發送者和接收者是否已經加載的類該對象,則不能在類名本身由JVM進行驗證中使用。

回答

4

你錯過它說報價的後半部分:

是相對於系列化兼容

您需要,可以,如果你想擁有多個「版本中修正的標識符「的序列化類對象。只有傳入課程名稱才能做到這一點。

舉個類比,這有點像說我們爲什麼需要通過HTTP版本(HTTP/1.1),因爲它最終是HTTP。這是協議「版本」以及協議本身的決定。

+0

Doc聲明「serialVersionUID」必須是** static **,** final **和long類型(即類級別常量)。然後在那裏出現改變標識符的問題。並且在運行時,加載的類名無論如何都是唯一的,那麼爲什麼不能使用類名作爲id,只要基本的目的是驗證序列化的發送者和接收者對象已經爲該對象加載了** **類**。當然,我錯過了一些東西。 – cooper 2014-09-12 16:26:34

+0

@cooper:想象一個不斷髮展的類/模式。你可以繼續添加/刪除你的類的字段。要跟蹤這些更改,您可以繼續增加版本ID。當序列化數據被髮送時,接收器會檢查「版本」以及類的類型;如果類類型匹配但版本不匹配,則反序列化不起作用。當您創建像RMI這樣的服務時,這非常重要,其中序列化的類對象在客戶端和服務器之間交換,以及客戶端和服務器都處理相同的「邏輯」模式的重要性。 – 2014-09-12 17:20:15

+0

True sir.Nice Usecase.JVM在生成UID時會考慮類的所有成員,可能是jvmVersion&OS。但DOC不會聲明/建議使用UID來跟蹤對類結構所做的更改。它指出「強烈建議_it所有可序列化的類都顯式聲明瞭UID值,因爲默認的UID計算對類的細節高度敏感,而這些細節可能因編譯器實現而有所不同,「似乎我們明確地要添加補丁。理論上,通過UID跟蹤不斷變化的類結構是可以理解的,需要思考在方便/實際上有多遠 – cooper 2014-09-12 19:53:14

0

嗯,明白序列化類和它的serialVersionUID,最好的地方將被讀取其完整的Java文檔(java.io.Serializable),與適當的例子說明的概念。

你的問題似乎是this question.的重複一個適當和成熟的討論已經完成了這個主題。希望這可以幫助。

+0

先生,看起來像討論是關於「**爲什麼要使用SerialVersionUID **」。如果您不介意,您可否將複製精確回答我的問題的成熟討論中的特定部分,即**爲什麼jvm生成serialVersionUID **,而不是將類名稱本身用於驗證目的。 – cooper 2014-09-12 15:53:38

相關問題