[英]Serializing enums
我有一個序列化的 object ,我在其中添加了一個枚舉。 這使得它不再與舊版本的軟件兼容。 我相信這是因為舊版本是用 Java 1.4 編譯的。 我得到:
java.io.InvalidClassException: cannot bind enum descriptor to a non-enum class
理想情況下,我想用字符串替換枚舉並以某種方式修復現有的 object。
有幾個想法是:
讀取序列化的 object 時,忽略帶有枚舉的字段。 價值會丟失,但沒關系。
有兩個序列化的 class 副本,用枚舉重命名一個,並以某種方式將 object 讀入新重命名的 class。
只需將enum
字段標記為transient
。 它不會被序列化。
你會失去那個價值,但你說你不介意。
transient
是一個 Java 關鍵字。
它將一個字段標記為不應被視為對象的持久 state 的一部分。
它標記成員變量在持久化為字節流時不被序列化。 當通過網絡傳輸 object 時,需要對 object 進行“序列化”。 序列化將 object state 轉換為串行字節。 這些字節通過網絡發送,object 從這些字節重新創建。 由 java 瞬態關鍵字標記的成員變量不會被轉移,它們是故意丟失的。 [來源]
我相信這是因為舊版本是用 Java 1.4 編譯的。 我得到:
沒有。Java 1.4.1 中沒有枚舉。 它們是在 1.5 中引入的。 似乎發生的事情是,被序列化為字符串的東西隨后被更改為枚舉。
理想情況下,我想用字符串替換枚舉
您提議的更改只是扭轉了這一點。
並以某種方式修復現有的 object。
您無法修復現有的序列化 object,但您可以通過還原源或確定它必須是什么並聲明相同的 serialVersionUID 來使當前的 class 與其兼容。
最簡單的解決方案是使用新代碼讀取序列化實體,並以舊版本軟件可以理解的格式將其寫出。 當然,如果這不是一個可行的解決方案,您可能需要進一步闡明您的要求。 比如哪些部分可以改變,哪些不能改變等等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.