java - 类对反序列化无效 - 从文件反序列化但不是 blob?

标签 java mysql serialization blob deserialization

问题出在查询我的数据库后尝试反序列化结果集中返回的类 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/gw2apiModified/blob/master/src/main/java/me/nithanim/gw2api/v2/api/items/ItemInfo.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.

这是不正确的。它应该说的是该类的最近的不可序列化父 类没有可访问的无参数构造函数。我怀疑这是这种情况下的问题。注意:如果 BasicItemSerializable,则不需要这样的构造函数。

关于java - 类对反序列化无效 - 从文件反序列化但不是 blob?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37122622/

相关文章:

从 Android 中的 URL 获取 HTML 源代码的 Java 代码不起作用

java - 在每个循环中,我想在最后一次迭代中跳过 ", "

javascript - 如何在php中将prompt()值存储到数据库中

c# - 反序列化通用集合 - 空着

java - 发牌算法

java - 只有 2 个线程用于调用生产和消费?

mysql - 如何从自连接表中获取最大stop_date

mysql - 从 MySQL 导入 JOINed 表时,数据已被自动删除

c# - 不序列化字段但显示在检查器中

c# - 使用 C# 解析复杂的 JSON 结果