java - 当对象的类存储在外部 jar 中时,如何反序列化对象?

标签 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,给定包含 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 ,但我不确定它在此设置中如何工作,其中类的类型完全未知,但类的父级已知。

最佳答案

我自己还没有这样做,但从一些谷歌搜索来看,这个问题似乎有两个阶段。

  1. 创建一个可以加载相关类的类加载器。
  2. 创建(或在第三方库中找到一个现有的)ObjectInputStream 的子类,该子类覆盖 resolveClass 方法以使用您的 ClassLoader 而不是自动选择的类加载器。使用 ObjectInputStream 的子类来读取您的文件。

https://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html#resolveClass%28java.io.ObjectStreamClass%29

关于java - 当对象的类存储在外部 jar 中时,如何反序列化对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34011639/

相关文章:

c# - .net 中的 Xml 序列化和架构 (C#)

ruby-on-rails - 当加载根命名空间中的另一个同名类时,Rails 类加载会跳过命名空间类

java - 尝试将数组的克隆保存在 txt 文件中但返回 NULL

java - 将消息附加到 MaildirFolder 时出现 FileNotFoundException

java - Struts 2约定插件-上传超过2MB的文件

c# - 使用 System.Text.Json 即时格式化 JSON 流

java - 如何通过CRLF逐行读取文件

Python:使用 `pickle`或 `marshal`与使用 `re`的性能比较

java - this.getClass().getResource ("xyz.class") 在 OSGi 环境中不返回 DIR PATH

java - 从 getResource 解析 webapp 的根目录