问题出在查询我的数据库后尝试反序列化结果集中返回的类 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
元素集类: github.com/feltax/gw2apiMark2/blob/master/src/main/java/ItemSets/itemSet.java
我的数据库: imgur.com/zfPLSsq
我尝试过的事情:
Serial 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
尝试序列化和反序列化字节数组、输入流并使用获取对象
最后我在 reddit 上寻求帮助,但我并没有真正取得进展。这里:www.reddit.com/r/learnprogramming/comments/4i68fj/java_class_invalid_for_de_serialization_error/
我现在尝试的新事物:
向 basicItem 添加一个简单的无参数构造函数并重建代码/数据库,不幸的是仍然遇到同样的错误。
public BasicItem() {
}
-- 感谢EJP的建议
作为一个想法,这可能与出现在多个 itemSets 中的单个项目有关吗? java 在反序列化之前已经反序列化的对象时是否有问题?
最佳答案
java.io.InvalidClassException: me.nithanim.gw2api.v2.api.items.ItemInfo; class invalid for deserialization
Javadoc中提出的原因如下:
Thrown when the Serialization runtime detects one of the following problems with a Class.
- The serial version of the class does not match that of the class descriptor read from the stream
在这种情况下,错误消息会这样说,同时显示两个值。
- The class contains unknown datatypes
我从来没有见过这个,我不相信它是正确的。我希望这会导致 ClassNotFoundException
。
- The class does not have an accessible no-arg constructor.
这是不正确的。它应该说的是该类的最近的不可序列化父 类没有可访问的无参数构造函数。我怀疑这是这种情况下的问题。注意:如果 BasicItem
是 Serializable
,则不需要这样的构造函数。
关于java - 类对反序列化无效 - 从文件反序列化但不是 blob?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37122622/