我实现了Serializable
来保存对象,像这样:
public class MyType implements Serializable {
@Override
public String toString() {
return "This is a MyType";
}
public static void main(String[] args) {
try {
ObjectOutputStream outStream = new ObjectOutputStream(
new FileOutputStream("objecturl");
outStream.writeObject(new MyType());
outStream.flush();
} catch (Exception e) { e.printStackTrace(); }
}
}
我运行该程序一次,因此 MyType
保存在 objecturl
中。
然后,我将那个单类库打包到 jarurl
的 jar 中。
如果我想在一个新程序中使用我保存的对象,我怎样才能让我的新程序访问 MyType
,给定包含 MyType.class
的 jar >?
换句话说,我如何使用 jarurl
中的 jar 来允许以下内容在没有 ClassNotFoundException
的情况下工作?
public class NewProgram {
public static void main(String[] args) {
try {
ObjectInputStream inStream = new ObjectInputStream(
new FileInputStream("objecturl");
Object o = inStream.readObject();
System.out.println(o.toString());
} catch (Exception e) { e.printStackTrace(); }
}
}
输出将是“This is a MyType”,并且 MyType
不包含在与 NewProgram
相同的库中。
显然还有其他方法可以让程序输出“This is a MyType”。我在这里主要关心的是序列化、覆盖实现的使用。
我知道这有 something to do with ClassLoaders ,但我不确定它在此设置中如何工作,其中类的类型完全未知,但类的父级已知。
最佳答案
我自己还没有这样做,但从一些谷歌搜索来看,这个问题似乎有两个阶段。
- 创建一个可以加载相关类的类加载器。
- 创建(或在第三方库中找到一个现有的)ObjectInputStream 的子类,该子类覆盖 resolveClass 方法以使用您的 ClassLoader 而不是自动选择的类加载器。使用 ObjectInputStream 的子类来读取您的文件。
关于java - 当对象的类存储在外部 jar 中时,如何反序列化对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34011639/