簡體   English   中英

序列化枚舉

[英]Serializing enums

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

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

理想情況下,我想用字符串替換枚舉並以某種方式修復現有的 object。

有幾個想法是:

  1. 讀取序列化的 object 時,忽略帶有枚舉的字段。 價值會丟失,但沒關系。

  2. 有兩個序列化的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM