可序列化的类不能反序列化 [英] Serializable class cannot be deserialized

查看:111
本文介绍了可序列化的类不能反序列化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个图要存储在数据库中,并在另一个程序包中检索它.我的图形签名是:

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();
    }

}

推荐答案

  1. 验证ModuleNode的所有超类的参数构造函数为空,因为在反序列化期间发生了异常.
  2. 验证所有ModuleNode超类是否实现了可序列化的接口,并且在反序列化期间它们的serialVersionId不会更改

这篇关于可序列化的类不能反序列化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆