我正在用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();
}
}
该对象是 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;
}
谁能帮我这个 ?
多谢。
类名更改(包括包名更改)是破坏序列化机制的保证方法;它根本不适合与更改名称的类一起使用。
几乎您唯一能做的就是撤消重构以获取最初命名的类,然后将当前版本放入同一工作区,使用原始类进行反序列化,以编程方式将其内容复制到重构类的实例中,然后将其序列化。
如果您想避免这种麻烦,请考虑使用更健壮和灵活的序列化方法,例如XStream http://xstream.codehaus.org/.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)