Java 序列化枚举
我有一个序列化对象,我在其中添加了一个枚举。这使得它不再与旧版本的软件兼容。我相信这是因为旧版本是用Java1.4编译的。我得到:Java 序列化枚举,java,serialization,enums,Java,Serialization,Enums,我有一个序列化对象,我在其中添加了一个枚举。这使得它不再与旧版本的软件兼容。我相信这是因为旧版本是用Java1.4编译的。我得到: java.io.InvalidClassException: cannot bind enum descriptor to a non-enum class 理想情况下,我希望用字符串替换枚举,并以某种方式修复现有对象 以下是一些想法: 读取序列化对象时,忽略带有枚举的字段。值会丢失,但这没关系 拥有序列化类的两个副本,使用枚举重命名该副本,并以某种方式将对象读入
java.io.InvalidClassException: cannot bind enum descriptor to a non-enum class
理想情况下,我希望用字符串替换枚举,并以某种方式修复现有对象
以下是一些想法:
最简单的解决方案是使用新代码读取序列化实体,并以旧版本软件可以理解的格式写出。当然,如果这不是一个可行的解决方案,您可能需要进一步澄清您的需求。如哪些部分可以更改,哪些部分不能更改等。只需将
enum
字段标记为transient
。它不会被序列化。你会失去价值,但你说你不介意
transient
是一个Java关键字。它将字段标记为不应被视为对象持久状态一部分的内容。
当成员变量被持久化为字节流时,它将其标记为不被序列化。当对象通过网络传输时,该对象需要“序列化”。序列化将对象状态转换为串行字节。这些字节通过网络发送,并根据这些字节重新创建对象。由java transient关键字标记的成员变量不会被传输,而是故意丢失。[] 我相信这是因为年龄越大 版本是用Java1.4编译的。我 获取: 否。Java 1.4.1中没有枚举。它们是在1.5中引入的。似乎发生的情况是,序列化为字符串的内容随后被更改为枚举 理想情况下,我想更换 用字符串枚举 你提议的改变正好相反 然后用某种方式修复这个问题 现有对象
无法修复现有序列化对象,但可以通过还原源使当前类与其兼容,或者弄清楚它必须是什么,并声明一个相同的serialVersionUID。我讨厌人们用一个没有帮助的注释来否决投票。您是否在寻找从序列化对象获取值的解决方案?我的意思是,检索序列化的值是您关心的问题吗?什么时候会出现此异常?以下解释正确吗?您希望旧代码、未修改的代码能够成功读取由新代码编写的序列化对象,您可以随意修改这些对象;如果旧代码忽略了
enum
属性的序列化值,这没关系。这对他的问题没有帮助。他已经用该字段的数据序列化了对象。您的建议在对象版本控制规范#5.6.1中列为不兼容的更改。