2011-07-05 185 views
4

我有一個序列化的對象,我添加了一個枚舉。這使它不再與舊版本的軟件兼容。我相信這是因爲舊版本是用Java 1.4編譯的。我得到:序列化枚舉

java.io.InvalidClassException: cannot bind enum descriptor to a non-enum class 

理想情況下,我想用一個字符串替換枚舉並以某種方式解決現有的對象。

一對夫婦的想法是:

  1. 當讀取序列化對象,忽視了場枚舉。價值會丟失,但沒關係。

  2. 有兩個序列化類的副本,用enum重命名它,並以某種方式將對象讀入新重命名的類。

+9

我討厭它,當人們downvote與一個沒有幫助的評論。 –

+0

您是否在尋找解決方案來獲取序列化對象中的值?我的意思是,檢索您關心的序列化值? –

+0

你什麼時候得到這個異常? – skaffman

回答

0

最簡單的解決方案是使用新代碼讀取序列化的實體,然後以舊版軟件可以理解的格式寫出它。當然,如果這不是一個可行的解決方案,你可能需要更多地闡明你的需求。至於哪些部分可以更改,什麼不能更改等。

3

只需將enum字段標記爲transient即可。它不會被序列化。
你會失去這個價值,但你說你不介意。

transient是一個Java關鍵字。
它將一個字段標記爲不應被視爲對象的持久狀態的一部分。
它標記了一個成員變量,當它被持久化爲字節流時,它不會被序列化。當一個對象通過網絡傳輸時,對象需要被「序列化」。序列化將對象狀態轉換爲串行字節。這些字節通過網絡發送,並從這些字節重新創建對象。由java transient關鍵字標記的成員變量不會被傳輸,它們會被故意丟失。 [source]

+0

這不會幫助他的問題。他已經爲該字段的數據序列化了對象。您建議的內容在對象版本規範#5.6.1中列爲不兼容的更改。 – EJP

1

我相信這是因爲上了年紀 版本的Java編譯1.4。 I 得到:

不。在Java 1.4.1中沒有枚舉。它們在1.5版中引入。似乎發生的事情是,被序列化爲字符串的東西隨後被更改爲Enum。

理想情況下,我想用一個字符串

您建議的更改只是扭轉這一更換 枚舉。

並以某種方式修復了 現有的對象。

您不能修復現有的序列化對象,但可以使當前類與它兼容,通過還原源代碼或指出它一定是什麼並聲明相同的serialVersionUID。