2012-08-09 79 views
5

我有下面的類簽名和ClientEventSourc實現Serializable瞭解FindBugs的警告有關的serialVersionUID領域的

public class Grid extends ClientEventSource implements Focusable, FramingBlockWrapper,LIMSEditableField 

現在FindBugs被列出這是狡猾的:

類是可序列,但沒有定義serialVersionUID

該類實現了Serializable接口,但不定義 serialVersionUID字段。一個簡單的變化就像添加一個對象的引用 一樣.class對象會向該類中添加合成域,這將不利地改變隱含的serialVersionUID(例如,將一個 引用添加到String.class將生成一個靜態域 class $ java $ LANG $字符串)。此外,不同的源代碼到字節碼 編譯器可能會使用不同的命名約定來生成引用類對象或內部類的合成變量 。要確保不同版本的Serializable的 互操作性,請考慮添加一個顯式serialVersionUID。

有人可以解釋它是什麼意思,什麼是最好的方法來解決這個問題?

回答

7

serialVersionUID用於反序列化您的類。它是默認自動生成的。
但改變你的類中的任何東西都會生成一個不同的serialVersionUID,並且你不能對「舊」對象進行反序列化。
所以你定義了你自己的serialVersionUID來幫助反序列化找到合適的類。參考有關生成UID

private static final long serialVersionUID = 6106269076155338045L; 

這樣添加變量到你的代碼

Does it matter what I choose for serialVersionUID when extending Serializable classes in Java?

+0

是否有任何算法/程序產生這個數字?我的意思是它可以是任何事情,或者需要遵循某些最佳實踐,正如有效的java書中所描述的那樣,hashcode()可以在EqualsBuilder和HashCodeBuilder中從apache commons中實現。 – Geek 2012-08-09 10:55:27

+0

這個數字可以是任何東西,只要它在你的序列化類中是唯一的。 Eclipse f.e.有自己的發電機,但你可以使用任何數字。 – Kostronor 2012-08-09 10:58:12

2

一些能解釋這是什麼意思

對班級所做的微小更改會更改您不想要的serialVersionUID,因爲這可能會導致無法正常進行反序列化。

什麼是解決這個問題的最佳方法?

按照它的建議進行設置。

private static final long serialVersionUID = 1; 

是否有任何算法/程序生成此數字

是。這是您試圖繞過的算法,而不是重新創建。從1開始。

我的意思是它可以是任何東西,它需要遵循某些最佳實踐

我會建議使用1是最佳做法,因爲它明確這是任意選擇一個被覆蓋的值。使用像6106269076155338045L這樣的大數值可能看起來像一個生成的數字或選擇這個數字的原因。

+0

這是一個不錯的選擇嗎?你能回答我對Kostronor答案的評論嗎? – Geek 2012-08-09 10:56:23

+0

價值的選擇並不重要。每當你做出重大改變時,你都應該改變它。即當您不希望其他版本作爲此版本進行反序列化時進行更改。根據我的經驗,這幾乎從來沒有。 ;) – 2012-08-09 10:58:18

1

該值用於反序列化。它的目的是保持類和它們相應的序列化對象之間的兼容性。如果序列化類型爲A的對象,然後以某種方式更改A,則此機制會阻止您反序列化對象;該對象和它的類不匹配,你會得到運行時錯誤。

JDK中有serialver.exe。如果你給它一個.class文件作爲參數,它會吐出一個serialVersionUID。大多數IDE具備此功能內置輸入

例:

> serialver MyClass 

(已經有一個文件MyClass.classMyClass必須實現Serializable)輸出的

例子:

> MyClass: static final long serialVersionUID = -8174364448753809256L; 

如果你討厭在命令行上做事,那麼執行如下程序:

> serialver -show 

將顯示此GUI:

serialver screenshot

然後,您可以鍵入類的名稱,並單擊 「顯示」。

我建議你閱讀關於序列化過程,如果它感興趣的話。你會發現爲什麼需要這個版本ID,生成它時會考慮哪些字段/方法等等。

+0

你知道如何在Intellij Idea中做到這一點? – Geek 2012-08-09 11:29:12

+0

@Geek不,對不起。我只用了幾個小時的IDE ......我知道如何在Eclipse和Netbeans中做到這一點。 – 2012-08-09 11:32:45