问题在于在查询数据库后尝试反序列化在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
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是否有问题解除其之前已经取消分类的对象?
答案 0 :(得分:1)
java.io.InvalidClassException: me.nithanim.gw2api.v2.api.items.ItemInfo; class invalid for deserialization
Javadoc中提出的原因如下:
当Serialization运行时检测到类的以下问题之一时抛出。
- 该类的串行版本与从流
读取的类描述符的版本不匹配
在这种情况下,错误消息会这样说,同时显示两个值。
- 该类包含未知数据类型
我从未见过这一点,我也不相信这是对的。我希望这会导致ClassNotFoundException
。
- 该类没有可访问的no-arg构造函数。
这不正确。它应该说的是,类最近的非可序列化父类没有可访问的无参数构造函数。我怀疑这是问题所在。 NB如果BasicItem
为Serializable
,则不需要这样的构造函数。