2011-10-12 30 views
6

當我創建Java類在Eclipse中,它實現Serializable接口,我得到一個警告如何的serialVersionUID計算

的序列化的類ABCD沒有聲明long類型的靜態最終 的serialVersionUID領域

所以當我點擊警告時,我在Eclipse中得到一個選項

添加生成的序列版本號

一旦我選擇該選項,Eclipse會自動爲我創建一個serialVersionUID變量。

現在我想知道該數字是以什麼爲基礎生成的。這是一個隨機數字嗎?我可以提供我自己的隨機數嗎?

回答

12

它根據您的課程結構 - 字段,方法等進行計算。它的確切格式在Object Serialization Specification-see this section中指定。

該規範描述了未提供值時發生的情況,但自動生成使用相同的算法。

流中的物品的順序如下:

  • 的類名。
  • 類修飾符寫成32位整數。
  • 按名稱排序的每個接口的名稱。
  • 對於按字段名稱排序的類的每個字段(私有靜態和私有瞬態字段除外:*字段的名稱。* 字段的修飾符寫爲32位整數。*描述符 。字段
  • 如果一個類初始化器存在,寫出來的以下:*的方法的名稱,*的方法, java.lang.reflect.Modifier.STATIC,寫爲32位整數的改性劑。 *方法的描述符 ()V。
  • 對於按方法名稱和簽名排序的每個非私有構造函數:*方法的名稱,。*方法的修飾符,編寫爲32位整數。 *方法的描述符。
  • 對於按方法名稱和簽名排序的每個非私有方法:*方法的名稱。 *該方法的修飾符被寫爲 的32位整數。 *方法的描述符。
4

自動生成serialVersionIds是基於該方法的簽名,參數等類中的類的散列。這樣做是爲了讓serialVersionId在您更改類時發生更改,這表明序列化機制中數據/類不再兼容。這是默認設置。

當你定義你自己的時候,只需從1開始,當類不再與以前的序列化數據兼容時就增加。