2015-08-17 55 views
1

如果我在我的應用程序的每個類上實現了Serializable,以便可以在Jboss集羣環境中輕鬆運行應用程序。在Java Serlization中,我們必須使用哪種串行版本ID生成方法?

現在,如果我實現我的班Serializable,日食顯示如下消息

的序列化類沒有聲明型長

現在它給我三個靜態 最後的serialVersionUID領域選項

  1. 添加默認序列號版本號
  2. 添加生成的序列版本ID
  3. 添加@SuppressWarings爲「串行」

如果我會選擇首先它會產生這樣的

private static final long serialVersionUID = 1L; 

如果我會選擇第二個它會產生這樣的

private static final long serialVersionUID = 1629728947486980072L; 

第三我們可以很容易地忽略,因爲我們必須在集羣環境中運行應用程序,所以我們必須添加ve rsionID無論如何What is a serialVersionUID and why should I use it?

現在,我告訴我必須實現序列化每個和非常類哪一個更好的方法。 Approach1還是Appraoch2?

  1. 添加默認串行版本ID
  2. 添加生成的序列版本ID
+2

[什麼是serialVersionUID,爲什麼我應該使用它?]可能的重複(http://stackoverflow.com/questions/285793/what-is-a-serialversionuid-and-why-should-i-use-它) – Aestel

+0

@Aestel這個問題不是你提到哪個問題,而是詢問哪種方法可以生成版本ID。 –

+0

看看http://stackoverflow.com/questions/605828/does-it-matter-what-i-choose-for-serialversionuid-when-extending-serializable-cla –

回答

0

java.io.Serializable doc說:

與每個序列化類

序列化運行時相關聯一個 版本號,稱爲serialVersionUID,在 反序列化過程中用於驗證序列化的012的發送者和接收者對象已經加載了該對象的類,該對象與序列化方面的 兼容。如果接收方已加載 對象的類,該對象的serialVersionUID與 對應的發送者類不同,則反序列化將導致 InvalidClassException

因此,您可以將serialVersionUID視爲類的「哈希碼」。因此,第二種方法肯定是更好的,因爲第一種非常相似(幾乎相等)到將@SuppressWarings添加到'串行'。請致電this blog

+0

我的問題是我們必須使用哪種方法?用於項目中的所有類 1-添加默認串行版本ID或 2-添加生成的串行版本ID –

1

A serialVersionUID構成一個合乎邏輯的burdon:應該仔細維護。

它的隱式生成(編譯器哈希方法簽名等)是有限的。所以不要禁止警告。

最佳版本應儘可能保持相同,並可能更新舊類定義的持久對象。

至少在新的類定義上,serialVersionUID 必須更改

要做出的改變更有吸引力,我在日期時間爲yyyymmddhhmm的形式使用的serialVersionUID:

private static final long serialVersionUID = 201508171605L; 

對於日期時間2015-08-17T16:05。

BTW:一個很好的機會,申請下劃線:

private static final long serialVersionUID = 2015_08_17__16_05L; 

這使得一個監督版本UID更容易辨認。

+0

同意我們可以像這樣使用'private static final long serialVersionUID = 201508171605L;'所以它意味着'private static final long serialVersionUID = 1L;'是牀的方法?因爲我們選擇添加'默認串行版本ID',它會生成'versionid = 1L'現在我們遵循相同的方法來處理所有的類會發生什麼? –

+0

問題是,當序列化的數據改變時,看到1L或2L將不會引起增加數字。很可能,serialVersionUID被忽略。 (好的,也有很好的團隊。) –

+0

還有點混淆 –

相關問題