当一个对象存储在外部jar中时,如何反序列化该对象?

时间:2015-12-01 02:35:11

标签: java serialization classloader

我实现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的jar的情况下,如何将MyType.class访问我的新程序?

换句话说,我如何在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(); }
    }
}

输出为"这是MyType",MyTypeNewProgram不在同一个库中。

显然还有其他方法可以让程序输出"这是一个MyType"。我主要关注的是使用序列化的,重写的实现。

我知道这有something to do with ClassLoaders,但我不确定它在这个设置中是如何工作的,其中类的类型是完全未知的,但是类的父类是已知的。< / p>

1 个答案:

答案 0 :(得分:1)

我自己也没有这样做,但是通过谷歌搜索似乎有两个阶段来解决这个问题。

  1. 创建一个可以加载相关类的ClassLoader。
  2. 创建(或查找第三方库中存在的)ObjectInputStream的子类,该子类重写resolveClass方法以使用ClassLoader而不是自动选择的ClassLoader。使用ObjectInputStream的子类来读取您的文件。
  3. https://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html#resolveClass%28java.io.ObjectStreamClass%29