當我創建Java類在Eclipse中,它實現Serializable
接口,我得到一個警告如何的serialVersionUID計算
的序列化的類ABCD沒有聲明long類型的靜態最終 的serialVersionUID領域
所以當我點擊警告時,我在Eclipse中得到一個選項
添加生成的序列版本號
一旦我選擇該選項,Eclipse會自動爲我創建一個serialVersionUID
變量。
現在我想知道該數字是以什麼爲基礎生成的。這是一個隨機數字嗎?我可以提供我自己的隨機數嗎?
當我創建Java類在Eclipse中,它實現Serializable
接口,我得到一個警告如何的serialVersionUID計算
的序列化的類ABCD沒有聲明long類型的靜態最終 的serialVersionUID領域
所以當我點擊警告時,我在Eclipse中得到一個選項
添加生成的序列版本號
一旦我選擇該選項,Eclipse會自動爲我創建一個serialVersionUID
變量。
現在我想知道該數字是以什麼爲基礎生成的。這是一個隨機數字嗎?我可以提供我自己的隨機數嗎?
它根據您的課程結構 - 字段,方法等進行計算。它的確切格式在Object Serialization Specification-see this section中指定。
該規範描述了未提供值時發生的情況,但自動生成使用相同的算法。
流中的物品的順序如下:
- 的類名。
- 類修飾符寫成32位整數。
- 按名稱排序的每個接口的名稱。
- 對於按字段名稱排序的類的每個字段(私有靜態和私有瞬態字段除外:*字段的名稱。* 字段的修飾符寫爲32位整數。*描述符 。字段
- 如果一個類初始化器存在,寫出來的以下:*的方法的名稱,*的方法, java.lang.reflect.Modifier.STATIC,寫爲32位整數的改性劑。 *方法的描述符 ()V。
- 對於按方法名稱和簽名排序的每個非私有構造函數:*方法的名稱,。*方法的修飾符,編寫爲32位整數。 *方法的描述符。
- 對於按方法名稱和簽名排序的每個非私有方法:*方法的名稱。 *該方法的修飾符被寫爲 的32位整數。 *方法的描述符。
自動生成serialVersionIds是基於該方法的簽名,參數等類中的類的散列。這樣做是爲了讓serialVersionId在您更改類時發生更改,這表明序列化機制中數據/類不再兼容。這是默認設置。
當你定義你自己的時候,只需從1開始,當類不再與以前的序列化數據兼容時就增加。