【问题标题】:Equivalent of ObjectOutputStream, saving not only its state but the whole object?等效于 ObjectOutputStream,不仅保存它的状态,而且保存整个对象?
【发布时间】:2011-05-09 16:35:39
【问题描述】:

我让用户使用 URLClassLoader 从远程位置导入类似插件的类,因此这些导入的类不存在于构建路径中(但是,它们都实现了一个接口 IPlugin包括)。

我假设可以简单地使用 ObjectOutputStream 将所有加载的插件保存到文件中,然后使用 ObjectInputStream 读取它们。但情况似乎并非如此,因为它保存的只是对象的状态,而不是包含的逻辑(即方法)。

我希望做的是用 ObjectOutputStream 保存加载的插件列表(activePlugins):

ObjectOutputStream oos = new ObjectOutputStream(*fileoutputstream*);
oos.writeObject(activePlugins);
oos.close();

然后在另一个运行时,使用 ObjectInputStream 加载/恢复所有这些插件:

ObjectInputStream ois = new ObjectInputStream(*fileinputstream*);
activePlugins = (ArrayList<IPlugin>) ois.readObject();

但是由于实际的对象类在构建路径中不可用(它们位于硬盘驱动器的其他位置),所以它变得混乱了。我所追求的是在没有可用类的情况下加载对象的某种方式,即加载具有状态且不具有依赖关系的对象。

【问题讨论】:

  • 您还必须序列化流上的类字节。您可以通过getResourceAsStream 获取类字节,然后在另一边,使用这些字节在自定义类加载器中加载类,然后将生成的类转换为您的接口,并通过您的接口使用该对象。

标签: java serialization classloader


【解决方案1】:

您需要自己的类加载器。您基本上想要类似于 URLClassLoader 的东西,但能够在本地下载和缓存 jar。你可能想看看扩展 URLClassLoader 或实现类似的东西。您基本上只需要挂钩到下载 jar 的部分并将其粘贴到本地某个位置(或者如果您之前已经下载过它,则从该缓存位置加载它)。

【讨论】:

  • 我已经看了几分钟这个问题。一开始我无法理解这个问题,因为他同时在谈论状态和方法。我认为听起来他实际上都想要一个自定义类加载器(NetworkClassLoader)和 ObjectOutputStream。听起来他想保存插件的状态,而不仅仅是插件。还是我现在完全不在地图上?
  • 好点,我错过了他实际上确实想要保存对象状态。更新了我的答案。
【解决方案2】:

看看 RMI。这通过类传输机制扩展了序列化,因此您可以很好地序列化和反序列化(在接收方)未知类的对象,并执行它们的方法。

我认为这是使用一些远程类加载机制完成的。

【讨论】:

  • 为了加载类而使用 RMI 听起来是错误的。据我了解,他不想执行远程方法。
  • RMI 使用 Java 序列化的注解工具链接到代码的 URL(虽然它可以关闭)。
【解决方案3】:

Altought Java 不是我的主要编程框架,我在 PHP、Delphi 和 C# 等其他“框架”中看到了同样的问题。

一种解决方案是声明类文件和路径。

另一个建议是,正如您所指出的,您不关心逻辑,只关心(“数据”)状态,您可以声明一个存储属性值的通用类。

【讨论】:

    猜你喜欢
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多