反序列化无效的类 - 从文件工作但不是blob反序列化?

时间:2016-05-09 18:11:36

标签: java mysql serialization blob deserialization

问题在于在查询数据库后尝试反序列化在resultSet中返回的类itemSet的实例。 blobfile本身看起来很好,数据可以保存到文件然后使用文件读取器正确读取(见下文),因为我倾向于认为问题出在我的实现中的某个地方?该程序使用netbeans 8.01 ide在tomcat上运行。

我的项目git链接:https://github.com/feltax/gw2apiMark2

我的项目正在为几个类使用修改后的包装器:https://github.com/feltax/gw2apiModified

确切错误:

type Exception report message me.nithanim.gw2api.v2.api.items.ItemInfo; 
class invalid for deserialization
description The server encountered an internal error that prevented it from fulfilling this request.
exception java.io.InvalidClassException: me.nithanim.gw2api.v2.api.items.ItemInfo; class invalid for deserialization
 java.io.ObjectStreamClass$ExceptionInfo.newInvalidClassException(ObjectStreamClass.java:150)
java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:790)
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1775)
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2000)
java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1924)
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
Persistance.DbConnect.getItemSets(DbConnect.java:134)
Servlets.TestServlet.doPost(TestServlet.java:84)
javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)

note the full stack trace of the root cause is available in the Apache Tomcat/8.0.27 logs.

相关代码:(对不起链接,这是我第一次请求帮助,所以我不得不屠杀他们)

数据库连接代码:问题发生在第134行 github.com/feltax/gw2apiMark2/blob/master/src/main/java/Persistance/DbConnect.java

ItemInfo类: github.com/feltax/gw2apiModified/blob/master/src/main/java/me/nithanim/gw2api/v2/api/items/ItemInfo.java

ItemSet类: github.com/feltax/gw2apiMark2/blob/master/src/main/java/ItemSets/itemSet.java

我的数据库: imgur.com/zfPLSsq

我尝试过的事情:

串行UID声明,确保所有类实现可序列化并具有生成的serialUid(也没有serialUID)。

每次更改课程时重建数据库,从而重新安排存储在其中的所有对象。

通过将blob文件保存到mysqlworkbench中的文件,然后使用下面的代码读入对象,确保blob文件正确无误。 itemSet读得很好,文件也一样。 github.com/feltax/gw2apiMark2/blob/master/src/main/java/Persistance/apiDump.java

实施不可压缩的输入流:github.com/feltax/gw2apiMark2/blob/master/src/main/java/Persistance/DecompressibleInputStream.java

尝试序列化和反序列化字节数组,输入流并使用get对象

最后我在reddit上寻求帮助,但我并没有真正走得太远。在这里:www.reddit.com/r/learnprogramming/comments/4i68fj/java_class_invalid_for_de_serialization_error/

我现在尝试过的新内容:

向basicItem添加一个简单的no-args构造函数并重建代码/数据库,遗憾的是仍然会遇到相同的错误。

  public BasicItem() {
  }

- 感谢EJP的建议

作为一个想法,这可能与出现在多个itemSets中的单个项目有关吗? java是否有问题解除其之前已经取消分类的对象?

1 个答案:

答案 0 :(得分:1)

java.io.InvalidClassException: me.nithanim.gw2api.v2.api.items.ItemInfo; class invalid for deserialization

Javadoc中提出的原因如下:

  

当Serialization运行时检测到类的以下问题之一时抛出。

     
      
  • 该类的串行版本与从流
  • 读取的类描述符的版本不匹配   

在这种情况下,错误消息会这样说,同时显示两个值。

  
      
  • 该类包含未知数据类型
  •   

我从未见过这一点,我也不相信这是对的。我希望这会导致ClassNotFoundException

  
      
  • 该类没有可访问的no-arg构造函数。
  •   

这不正确。它应该说的是,类最近的非可序列化父类没有可访问的无参数构造函数。我怀疑这是问题所在。 NB如果BasicItemSerializable,则不需要这样的构造函数。