序列化枚举

时间:2011-07-05 17:40:59

标签: java serialization enums

我有一个序列化的对象,我添加了一个枚举。这使它不再与旧版本的软件兼容。我相信这是因为旧版本是使用Java 1.4编译的。我明白了:

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

理想情况下,我想用String替换枚举,并以某种方式修复现有对象。

有几点想法:

  1. 读取序列化对象时,忽略带枚举的字段。价值会丢失,但没关系。

  2. 拥有序列化类的两个副本,使用枚举重命名一个副本,并以某种方式将对象读入新重命名的类中。

3 个答案:

答案 0 :(得分:3)

只需将enum字段标记为transient即可。它不会被序列化 你会失去这个价值,但你说你不介意。

  

transient是一个Java关键字   它将字段标记为不应被视为对象持久状态的一部分   它标记了一个成员变量,当它被持久化为字节流时不被序列化。当通过网络传输对象时,该对象需要“序列化”。序列化将对象状态转换为串行字节。这些字节通过网络发送,并从这些字节重新创建对象。由java transient关键字标记的成员变量不会被转移,它们会被故意丢失。 [source]

答案 1 :(得分:2)

  

我相信这是因为年纪大了   version是使用Java 1.4编译的。一世   得到:

没有。 Java 1.4.1中没有枚举。它们是在1.5中引入的。似乎已经发生的事情是,序列化为String的内容随后被更改为Enum。

  

理想情况下我想替换   带字符串的枚举

您提议的更改只会改变这种情况。

  

并以某种方式修复   现有对象。

您无法修复现有的序列化对象,但您可以通过恢复源代码或确定它必须具有的内容并声明相同的serialVersionUID来使当前类与之兼容。

答案 2 :(得分:0)

最简单的解决方案是使用新代码读取序列化实体,并以旧版本软件可以理解的格式编写。当然,如果这不是一个可行的解决方案,您可能需要更多地澄清您的要求。至于什么部分可以改变,什么不能改变等。