Java:在重构=>"class not found"异常后加载保存在硬盘上的对象:/

Seb*_*_Lz 5 java load exception object save

我正在使用这种简单的方法在java中开发一个常规将对象保存到硬盘上的应用程序:

public void save(String filename)
{
    try
    {
        FileOutputStream fos = new FileOutputStream(filename);
        GZIPOutputStream gzos = new GZIPOutputStream(fos);
        ObjectOutputStream out = new ObjectOutputStream(gzos);
        out.writeObject(this);
        out.flush();
        out.close();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }

}
Run Code Online (Sandbox Code Playgroud)

该对象是sebbot.learning.DirectPolicySearch类的实例.

问题是,经过一些重构后,学习包被重命名为"ballcapture".现在,当我尝试加载保存的文件时,我得到以下异常:

java.lang.ClassNotFoundException:sebbot.learning.DirectPolicySearch

我用来加载文件的方法是:

public static synchronized DirectPolicySearch load(String filename)
{
    DirectPolicySearch dps = null;
    try
    {
        FileInputStream fis = new FileInputStream(filename);
        GZIPInputStream gzis = new GZIPInputStream(fis);
        ObjectInputStream in = new ObjectInputStream(gzis);
        dps = (DirectPolicySearch) in.readObject();
        in.close();
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

    System.out.println(dps);

    return dps;
}
Run Code Online (Sandbox Code Playgroud)

谁能帮我这个 ?非常感谢.

Mic*_*rdt 7

类名更改(包括包名更改)是打破序列化机制的有保证的方法; 它根本不适用于更改名称的类.

您可以做的唯一事情是撤消重构以获取最初命名的类,然后将当前版本放入同一工作区,使用原始类反序列化,以编程方式将其内容复制到重构类的实例中,然后序列化.

如果您想避免这种麻烦,请考虑使用更强大,更灵活的序列化方法,如XStream.