2012-03-05 69 views
3

我正在嘗試更新一些過去由其他人編寫的hibernate代碼,並運行到反序列化問題中。原代碼編寫的方式,它沒有明確的serialVersionUID聲明,只是實現Serializable接口 -休眠反序列化問題

public class SamplePOJO implements Serializable { 

現在,我想一個新列添加到表,並將其映射到該對象。我:

  1. 變更的表創建
  2. 更新的對象,包括一個新的String對象和getter /爲二傳手 新列,
  3. 更新.hbm文件與數據庫表列映射目的。

然而,當我編譯後運行它,我得到以下錯誤 -

"Error while deserializing from byte[]., caused by x.y.SamplePOJO; local class incompatible: stream classdesc serialVersionUID = 7997933458932550222, local class serialVersionUID = <other number internally auto generated as source didn't explicitly mention serialVersionUID>" 

如果我更新代碼以包括相匹配的上述錯誤拋出的serialVersionUID,它的執行沒有任何的問題。

根據我發現什麼信息,最常見的原因似乎是客戶端和服務器中的不同hibernate jar。然而,這不是這種情況,因爲它使用相同的Hibernate jar。如果有一種方法可以解決這個問題,而不必具體提及異常期間拋出的serialVersionUID,那麼有人可以提供幫助嗎?另外,如果我必須堅持這種方法,並且如果我的代碼移動到另一個環境(qa/prod),它是否會期望不同的serialVersionUID,這取決於它在其他環境中的序列化方式?

我會感激任何/所有的幫助!

回答

1

要首先回答第二個問題,由Java對象序列化規範指定由JVM在運行時生成serialVersionUID。雖然在運行時serialVersionUID的生成是可預測的,但它可以在java編譯器之間有所不同,因爲它依賴於編譯器實現特定的類文件的組成。因此,編譯後的代碼在運行時不應在不同的環境中生成不同的serialVersionUID。您可以使用JDK的serialver命令來計算一個類的運行時生成的serialVersionUID。

你說的是在客戶端和服務器上有hibernate jar,這聽起來像是你在兩個不同的JVM之間序列化你的實體,你確定客戶端有更新的實體類嗎?該錯誤表明您正試圖反序列化從不同版本的類文件的序列化中生成的一個字節[]。您需要確保您正在反序列化到相同版本的類中或將serialVersionUID添加到類中。

+0

謝謝。你澄清了我的疑問。 – JUG 2012-04-05 15:27:49