Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 序列化枚举_Java_Serialization_Enums - Fatal编程技术网

Java 序列化枚举

Java 序列化枚举,java,serialization,enums,Java,Serialization,Enums,我有一个序列化对象,我在其中添加了一个枚举。这使得它不再与旧版本的软件兼容。我相信这是因为旧版本是用Java1.4编译的。我得到: java.io.InvalidClassException: cannot bind enum descriptor to a non-enum class 理想情况下,我希望用字符串替换枚举,并以某种方式修复现有对象 以下是一些想法: 读取序列化对象时,忽略带有枚举的字段。值会丢失,但这没关系 拥有序列化类的两个副本,使用枚举重命名该副本,并以某种方式将对象读入

我有一个序列化对象,我在其中添加了一个枚举。这使得它不再与旧版本的软件兼容。我相信这是因为旧版本是用Java1.4编译的。我得到:

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中列为不兼容的更改。