2011-07-05 146 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。