2011-04-12 83 views

回答

28

這個解釋相當不錯here

的serialVersionUID的是Serializable類的通用版本標識符。反序列化使用此數字來確保加載的類完全對應於序列化對象。如果未找到匹配項,則引發InvalidClassException。

您可以通過添加

private static final long serialVersionUID = 7526472295622776147L; // unique id 

到類修復錯誤。

延伸閱讀:


一個側面說明:如果你正在使用Eclipse,如果你(和無一個人)曾經計劃序列化你的類,你也可以抑制錯誤或將

         窗口→首選項→Java的編譯器→→錯誤/警告

,並選擇 「忽略」, 「序列化類的serialVersionUID無」。

+3

你如何產生7526472295622776147L? – user496949 2011-04-12 08:01:57

+4

您只需選擇一個隨機(唯一)長整型值。在Eclipse中,你可以做*資料來源清理...-> Custome簡介 - >缺少代碼 - >添加序列版本ID * – aioobe 2011-04-12 08:02:43

+0

感謝aioobe,最後一點是我需要知道的。 – 2011-12-27 19:47:39

8

只需添加

private static final long serialVersionUID = 1L;//or some long 

Docs每個序列化類形容它很好

的序列化運行聯營 版本 號,稱爲的serialVersionUID, 這是反序列化 期間用於驗證序列化對象的發件人和收件人 已加載 類對於 與 序列化兼容的那個對象。如果接收方爲 加載了一個對象的類,該對象的 與對應的發件人類的 不同的serialVersionUID,然後反序列化將導致InvalidClassException的 。可序列化 類可以通過 聲明名爲 「的serialVersionUID」字段必須顯式聲明自己的 的serialVersionUID 靜態的,最終,和long類型:

ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L; 

如果 序列化類沒有明確 聲明serialVersionUID,則 串行化運行時將計算 默認serialVersionUID值 該類基於 該類的各個方面,如 Java(TM)Obj ect序列號 規範。然而,強烈 建議所有可序列化 類中明確聲明 的serialVersionUID值,因爲 默認的serialVersionUID計算 是類細節 高度敏感,可能取決於編譯器 實現而不同,因此可能會導致意外InvalidClassExceptions 在反序列化過程中。因此,要保證 保證一致 serialVersionUID值跨越 不同的java編譯器 的實現,可序列化類 必須聲明明確的 serialVersionUID值。這也是 強烈建議明確 的serialVersionUID聲明使用 private修飾符在可能的情況,因爲 這些聲明僅適用於 立即宣佈 類 - serialVersionUID的域不 可用作繼承的成員。

請參見

+0

爲什麼downvote?能否請您解釋.. – 2011-04-12 08:02:55

+0

我沒有downvote,但也許是因爲它是由[喬恩長柄水杓答案](來源一個冗長的副本http://stackoverflow.com/questions/285793/why-should-i-bother - 約-的serialVersionUID/285809#285809)。 – aioobe 2011-04-12 08:07:20

+0

http://download.oracle。com/javase/1.5.0/docs/api/java/io/Serializable.html – 2011-04-12 08:35:54

1

聲明它這樣:

通過Serializable接口需要
private static final long serialVersionUID = -4673040337179571462L; 

它。

+0

如何生成-4673040337179571462L – user496949 2011-04-12 08:02:16

0

你延伸的搖擺對象?

我經常使用@SuppressWarnings註釋來消除這個警告自己。

我猜surpressing警告或提供一個唯一的ID的問題取決於你的應用程序,您打算如何使用對象序列化的規模。

相關問題