gpt4 book ai didi

java - 无效类异常 : cannot bind non-enum descriptor to an enum class

转载 作者:行者123 更新时间:2023-11-30 06:01:01 34 4
gpt4 key购买 nike

我收到下面提到的错误。

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)

我认为这个问题是由于某个类被更改为枚举造成的。因此,我们在反序列化对象时遇到了上述异常。有什么办法可以处理吗?

最佳答案

答案是:并非如此。

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

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

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

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

更多细节...枚举常量可以轻松地用两个字符串表示:枚举类的名称,以及简单字符串形式的枚举常量。反序列化时,您可以使用该类名和枚举常量字符串作为 Enum.valueOf() 的输入。您可以在该调用周围放置一个 try/catch,并简单地捕获所有错误,或者您可以通过首先检查来添加更多智能:

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

关于java - 无效类异常 : cannot bind non-enum descriptor to an enum class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52275215/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com