可序列化的类不能反序列化 [英] Serializable class cannot be deserialized
问题描述
我有一个图要存储在数据库中,并在另一个程序包中检索它.我的图形签名是:
I have a graph i want to store in my DB and retrieve it in another package. My graph signature is:
public class ModuleToModuleDependencyGraph extends DependencyGraph<ModuleNode, ModuleToModuleDependency> implements Serializable
它扩展并使用的类的签名:
Signature of classes it extends and use :
public class DependencyGraph<V extends Node, E extends DependencyEdge<? extends DependencyData>> extends DefaultDirectedGraph<V, E> implements IDependencyGraph<V, E>, Serializable
public class ModuleNode extends Node implements Serializable
public class ModuleToModuleDependency extends DependencyEdge<ModuleToModuleDependencyData> implements Serializable
我用来保存到数据库(作为BLOB)的代码
The code i use to save to database(as BLOB)
ByteArrayOutputStream bos1 = new ByteArrayOutputStream();
ObjectOutputStream oos1 = new ObjectOutputStream(bos1);
oos1.writeObject(moduleGraph);
oos1.flush();
oos1.close();
bos1.close();
byte[] graph = bos1.toByteArray();
statement = connectionDB.prepareStatement("INSERT IGNORE INTO " + TABLE_NAME + " VALUES (?)");
statement.setObject(1, graph);
要从数据库检索的代码
ByteArrayInputStream bais = new ByteArrayInputStream(result.getBytes("graph"));
ObjectInputStream ins = new ObjectInputStream(bais);
Object O = ins.readObject();
我已经在与图有关的所有类中实现了Serializable(例如edge类).当存储在数据库中时,我没有问题,但是当我尝试检索它时,我得到了
I have implemented Serializable in all classes which are related to the graph(edge class for example). While storing in the DB i have no problem but when i try to retrieve it I get
java.io.InvalidClassException: com.mycompany.dpx.dependencytree.ModuleNode; class invalid for deserialization
为什么会出现此错误?我是否缺少使班级可序列化的内容?当我尝试不让ModuleNode类实现序列化而存储在数据库中时,它给了我一个错误,那就是它无法序列化,实现接口后,我没有得到这样的错误,所以这意味着ModuleNode可序列化了吗?
Why am i getting this error? Am i missing something to make the class serializable? When i tried to store in DB without making the ModuleNode class implement Serializable it gave me an error that it cannot serialize it, after implementing the interface i get no such error so it means that ModuleNode is serializable right?
更新:
ModuleNode.java:
ModuleNode.java:
package com.mycompany.dpx.dependencytree;
import com.mycompany.dpx.dependencytree.graph.Node;
import java.io.Serializable;
public class ModuleNode extends Node implements Serializable{
private static final long serialVersionUID = -1322322139926390329L;
private String sdfClassName;
private String moduleClassName;
public ModuleNode(){
}
/**
* Constructor for ModuleNode
* @param uid Unique identifier for the module. Immutable.
*/
public ModuleNode(String uid) {
super(uid);
this.sdfClassName = "";
this.moduleClassName = "";
}
/**
* Set the Source Data Factory class name for the module
* @param sdfClassName
*/
public void setSDFClassName(String sdfClassName) {
this.sdfClassName = sdfClassName;
}
/**
* Get the Source Data Factory class name for the module
* @return sourceDataFactoryClassName
*/
public String getSDFClassName() {
return this.sdfClassName;
}
/**
* Set the ViewModule class name for the module
* @param moduleClassName
*/
public void setModuleClassName(String moduleClassName) {
this.moduleClassName = moduleClassName;
}
/**
* Get the Module class name for the module
* @return moduleClassName
*/
public String getModuleClassName() {
return this.moduleClassName;
}
@Override
public boolean equals(Object o) {
return super.equals(o);
}
@Override
public int hashCode() {
return super.hashCode();
}
}
推荐答案
- 验证ModuleNode的所有超类的参数构造函数为空,因为在反序列化期间发生了异常.
- 验证所有ModuleNode超类是否实现了可序列化的接口,并且在反序列化期间它们的serialVersionId不会更改
这篇关于可序列化的类不能反序列化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!