2012-12-05 106 views
0

我有一個叫做Expression的類,它試圖使用下面的load()/ save()函數進行序列化。它曾經工作得很好,在對我的代碼和Expression類進行了一些更改之後,致電in.readObject()引發ClassCastException。 的錯誤信息是: java.lang.ClassCastException:java.lang.String中不能轉換到java.io.ObjectStreamClass中Java可序列化失敗

+0

除非Android Java開發中的東西差別很大,否則在我看來,您不需要爲此對象實現自己的序列化算法。我錯過了什麼嗎? – thatidiotguy

+0

您是否嘗試加載保存的序列化對象在更改Expression類定義之前? – femtoRgon

+0

之前存儲的內容已被刪除。 @thatidiotguy你是什麼意思實現我自己的算法?即時通訊只是添加實現Serializable。 – aviran

回答

0

對我來說,感覺很不好二進制數據存儲爲一個字符串。嘗試使用更穩定的方式來存儲ObjectOutputStream的二進制輸出。如果你真的想堅持使用字符串格式的方法,試着使用Base64編碼,這總是安全的。


我可能會看到一個問題是,你自己定義的serialUID靜態常量:

private static final long serialVersionUID = 3L; 

這個UID是用於確定是否在類路徑中的類與兼容輸入對象的類。所以我懷疑是你修改了這個類而不改變serialVersionUID。這使得ObjectInputStream認爲它是兼容的,但你仍然在使用舊數據。嘗試擺脫舊的數據,並重新啓動一個新的save()調用。


你確定Input也是可序列化的嗎?那個班的UID不是腐敗的?

+0

使用字符串是我現在可以做的......問題似乎是導致某些失敗的類的修改。字符串的使用工作正常 – aviran

+0

檢查我的更新。 –

+0

我試過修改serialVersionUID幾次,它沒有任何影響。那個早已被刪除的舊版本。通過調試我可以看到新的數據正在保存,但我嘗試加載它readObject()拋出一個異常, – aviran

0

它似乎可序列化不喜歡類成員字段中的NULL值。 如果我確保所有類成員都有實際的內存,它不會失敗。