2014-05-16 45 views
0

我目前正在寫一個項目,我有一個可序列化的類ClientRepository。該類不指定任何se​​rialVersionUID。 當我嘗試運行我的程序,我得到了以下異常:serialVersionUID異常

Exception in thread "main" java.io.InvalidClassException: ClientRepository; local class incompatible: stream classdesc serialVersionUID = -477189107700903771, local class serialVersionUID = -3576242897222506440 

所以我增加了一個默認的serialVersionUID(1L),但現在我得到

Exception in thread "main" java.io.InvalidClassException: ClientRepository; local class incompatible: stream classdesc serialVersionUID = -477189107700903771, local class serialVersionUID = 1 

我怎樣才能改變「流classdesc serialVersionUID「爲1L,所以它不會衝突?

謝謝!

回答

3

不要試圖改變數據 - 相反,如果你一定您的類仍與舊版本兼容(如果只有一個版本在野外有數據輸出),更改聲明serialVersionUID到-477189107700903771L以匹配數據中的值。該值是任意的 - 它只需要匹配數據中的內容。

當然,如果你的班級在不兼容的方式發生了變化,你需要編寫一些自定義的序列化代碼。

就我個人而言,我試圖避免這樣的原生二進制序列化,正是因爲這些脆性原因。你可能希望看看替代品,如Protocol Buffers

1

問題可能是在添加serialVersionUID = 1L之前序列化到存儲庫中的對象 - 它們仍然生成了與1L不同的serialVersionUID。您應該清除存儲庫。