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

时间:2018-09-11 11:49:20

标签: 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.ObjectInputStream.readClassDesc(ObjectInputStream.java:1713)

我认为问题出在某个班级,该班级有时改为枚举。因此,我们在反序列化对象时遇到了上述异常。 有什么办法可以解决?

1 个答案:

答案 0 :(得分:1)

答案是:不是。

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

并没有解决的办法:一旦ObjectOutputStream遇到此类问题,流本身就处于某种错误状态。无法捕获此类异常,然后继续从同一流中读取。

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

我们了解到这很困难。我们的解决方案是引入我们自己的枚举包装类。该类将枚举类和枚举常量作为 string 对象序列化。并具有用于反序列化时 rebuild 枚举实例的特殊代码(并注意潜在的版本冲突)。现在,我们不再序列化枚举,而是序列化了此类枚举包装器实例。

更多详细信息...枚举常量可以轻松地用两个字符串表示:枚举类的名称,以及简单的枚举常量作为纯字符串。反序列化时,可以使用该类名和枚举常量字符串作为Enum.valueOf()的输入。您可以在该调用周围进行一次try / catch操作,然后简单地捕获所有错误,也可以通过先检查以下内容来添加更多功能:

  • 是已知的反序列化类名称,它指向枚举类
  • 如果是这样:已知反序列化的枚举常量字符串,并由相应的枚举类支持