class 反序列化无效 - 从文件反序列化但不是 blob?
class invalid for deserialization - Deserializes from file working but not blob?
问题出在查询我的数据库后尝试反序列化结果集中返回的 class itemSet 的实例时。 blobfile 本身似乎很好,数据可以保存到文件中,然后使用文件阅读器(见下文)正确读取,因此我倾向于认为问题出在我的实现中的某个地方?该程序使用 netbeans 8.01 ide.
在 tomcat 上运行
我的项目gitlink:https://github.com/feltax/gw2apiMark2
我的项目使用了几个 classes 的修改包装器: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.
相关代码:(对不起link们,第一次求助所以只好砍了他们)
数据库连接代码:第 134 行出现问题
github.com/feltax/gw2apiMark2/blob/master/src/main/java/Persistance/DbConnect.java
物品集Class:
github.com/feltax/gw2apiMark2/blob/master/src/main/java/ItemSets/itemSet.java
我的数据库:
imgur.com/zfPLSsq
我尝试过的东西:
Serial UID 声明,确保所有 classes 实现可序列化并具有生成的 serialUid(也没有 serialUID)。
每当我更改 class 时重新创建数据库,从而重新序列化存储在其中的所有对象。
通过将 blob 文件保存到 mysqlworkbench 中的文件,然后使用下面的代码读入对象来确保 blob 文件是正确的。 itemSet 读起来很好,文件是 identical。
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 添加一个简单的无参数构造函数并重建 code/database,不幸的是仍然出现相同的错误。
public BasicItem() {
}
-- 感谢EJP的建议
想一想,这可能与出现在多个 itemSet 中的单个项目有关吗? 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.
这是不正确的。它应该说的是 class 的 最近的不可序列化父级 class 没有可访问的无参数构造函数。我怀疑这是这种情况下的问题。注意如果 BasicItem
是 Serializable
它不需要这样的构造函数。
问题出在查询我的数据库后尝试反序列化结果集中返回的 class itemSet 的实例时。 blobfile 本身似乎很好,数据可以保存到文件中,然后使用文件阅读器(见下文)正确读取,因此我倾向于认为问题出在我的实现中的某个地方?该程序使用 netbeans 8.01 ide.
在 tomcat 上运行我的项目gitlink:https://github.com/feltax/gw2apiMark2
我的项目使用了几个 classes 的修改包装器: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.
相关代码:(对不起link们,第一次求助所以只好砍了他们)
数据库连接代码:第 134 行出现问题 github.com/feltax/gw2apiMark2/blob/master/src/main/java/Persistance/DbConnect.java
物品集Class: github.com/feltax/gw2apiMark2/blob/master/src/main/java/ItemSets/itemSet.java
我的数据库: imgur.com/zfPLSsq
我尝试过的东西:
Serial UID 声明,确保所有 classes 实现可序列化并具有生成的 serialUid(也没有 serialUID)。
每当我更改 class 时重新创建数据库,从而重新序列化存储在其中的所有对象。
通过将 blob 文件保存到 mysqlworkbench 中的文件,然后使用下面的代码读入对象来确保 blob 文件是正确的。 itemSet 读起来很好,文件是 identical。 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 添加一个简单的无参数构造函数并重建 code/database,不幸的是仍然出现相同的错误。
public BasicItem() {
}
-- 感谢EJP的建议
想一想,这可能与出现在多个 itemSet 中的单个项目有关吗? 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.
这是不正确的。它应该说的是 class 的 最近的不可序列化父级 class 没有可访问的无参数构造函数。我怀疑这是这种情况下的问题。注意如果 BasicItem
是 Serializable
它不需要这样的构造函数。