Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.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 InvalidClassException:无法将非枚举描述符绑定到枚举类_Java_Deserialization - Fatal编程技术网

Java InvalidClassException:无法将非枚举描述符绑定到枚举类

Java InvalidClassException:无法将非枚举描述符绑定到枚举类,java,deserialization,Java,Deserialization,我得到下面提到的错误 java.io.InvalidClassException: cannot bind non-enum descriptor to an enum class at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:604) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1829) at java.io.Obj

我得到下面提到的错误

java.io.InvalidClassException: cannot bind non-enum descriptor to an enum class
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:604)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1829)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1713)
我认为这个问题是由于一个类在过去某个时候被更改为enum造成的。因此,在反序列化对象时,我们会得到上述异常。
我们有办法处理吗?

答案是:没有

这是Java枚举的一个大问题。当您直接序列化它们时,您会遇到各种版本控制问题

没有一个好办法可以解决这个问题:只要ObjectOutputStream遇到这样的问题,流本身就处于某种错误状态。不可能捕获此类异常,然后继续从同一个流读取

换句话说:如果您的对象流只包含所述枚举类的实例,那么您可以尝试/捕获并“忽略”该问题。但如果要反序列化多个值,则无法“跳过”该枚举实例并继续处理流中的后续对象

我们通过艰难的方式了解到了这一点。我们的解决方案是引入我们自己的枚举包装器类。该类将枚举类和枚举常量序列化为字符串对象。并且具有特殊代码,用于在反序列化时重建枚举实例(并处理潜在的版本控制冲突)。我们现在序列化这样的枚举包装器实例,而不是(反)序列化枚举

更多细节。。。枚举常量可以很容易地用两个字符串表示:枚举类的名称,以及简单地将枚举常量表示为普通字符串。反序列化时,可以使用该类名和枚举常量字符串作为的输入。您可以在该调用周围放置try/catch,并简单地捕获所有错误,也可以通过首先检查以下内容来添加更多smarts:

  • 反序列化的类名是否已知,并指向枚举类
  • 如果是:反序列化的枚举常量字符串是否已知,并且相应的枚举类是否支持该字符串

大家好,欢迎来到StackOverflow。请花些时间阅读帮助页面,特别是命名和的部分。更重要的是,请阅读。您可能还想了解。您能给出一个用于重建枚举的特殊代码的示例吗?@DeepakPandey不幸的是,我们在这里讨论的是几百行专有的非开源代码。我一个字也不能透露。不过,我会在答覆中再加上一段,概述我们所做的工作。