我有一个序列化的对象,我添加了一个枚举。这使它不再与旧版本的软件兼容。我相信这是因为旧版本是使用Java 1.4编译的。我明白了:
java.io.InvalidClassException: cannot bind enum descriptor to a non-enum class
理想情况下,我想用String替换枚举,并以某种方式修复现有对象。
有几点想法:
读取序列化对象时,忽略带枚举的字段。价值会丢失,但没关系。
拥有序列化类的两个副本,使用枚举重命名一个副本,并以某种方式将对象读入新重命名的类中。
答案 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)
最简单的解决方案是使用新代码读取序列化实体,并以旧版本软件可以理解的格式编写。当然,如果这不是一个可行的解决方案,您可能需要更多地澄清您的要求。至于什么部分可以改变,什么不能改变等。