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:
- 反序列化的类名是否已知,并指向枚举类
- 如果是:反序列化的枚举常量字符串是否已知,并且相应的枚举类是否支持该字符串