2013-10-14 45 views
1

我想序列化和反序列化一個Object,它包含一個顏色數組。 (顏色[] [])Deserialize java.awt.Color - > java.io.InvalidClassException

顏色數組表示一個小圖標。

經過一番構建當我嘗試反序列化對象我得到一個錯誤:

java.io.InvalidClassException: java.awt.Color; local class incompatible: stream classdesc serialVersionUID = 118526816875918197, local class serialVersionUID = 118526816881161077 

我能做些什麼來解決這個問題? 對象本身具有默認的UID(serialVersionUID的= 1L;)...

謝謝:)

+1

你在使用像jboss這樣的服務器嗎?也許你與罐子有衝突,你在本地使用的一個罐子,在服務器中是半開放的......不同的......它希望它有幫助。 – ZaoTaoBao

+0

Heyho :) 不,一切都是本地的...... 幾周前它工作沒有問題...不知道,爲什麼它現在崩潰:/我可以設置/看到顏色類的UID? –

+0

你在使用maven嗎? – ZaoTaoBao

回答

2

再次乘坐上的錯誤信息一看:

java.io.InvalidClassException: java.awt.Color; 
local class incompatible: 
stream classdesc serialVersionUID = 118526816875918197, 
local class serialVersionUID = 118526816881161077 

看來你連載該類使用Color的一個版本,並嘗試用其他的反序列化它。

這是我的環境中的serialVersionUID

private static final long serialVersionUID = 118526816881161077L; 

它匹配你的第二個serialVersionUID。然而,第一個不同:118526816875918197。這個事實有點奇怪,因爲我將這個版本ID與java 6和java 7 JDK進行了比較,它們是平等的。我無法將其與舊版JDK以及其他供應商提供的JDK(不是來自Oracle)進行比較。因此,我可以假定您使用舊版JDK或其他供應商的JDK(例如,打開JDK,IBM等)或其他平臺創建了您的文件。

如果是這種情況,我建議您通過實施自己的writeObject()readObject()方法來自定義班級的序列化。您不必重新實現所有類的序列化。用您自定義的包裝自定義序列化來包裝Color就足夠了。

序列化對象的BTW前向/後向兼容性是java整個序列化機制的一個衆所周知的弱點。您可以使用替代方法,例如序列化爲JSON,XML或其他二進制格式。

對於JSON,您可以將Jackson或Gson用於XML JAXB或Xstream,用於二進制格式protobuff。

+0

謝謝:) 問題是:我序列化和反序列化文件與我目前的版本:O 我不知道,如何UID可以改變? 如何包裝顏色? –

相關問題