Java 等效于ObjectOutputStream,不仅保存其状态,还保存整个对象?

Java 等效于ObjectOutputStream,不仅保存其状态,还保存整个对象?,java,serialization,classloader,Java,Serialization,Classloader,我允许用户使用URLClassLoader从远程位置导入类似插件的类,因此这些导入的类不存在于构建路径中(但是,它们都实现了包含的接口IPlugin) 我假设可以简单地使用ObjectOutputStream将所有加载的插件保存到文件中,然后使用ObjectInputStream读取这些插件。但情况似乎并非如此,因为它保存的只是对象的状态,而不是包含逻辑(即方法) 我希望用ObjectOutputStream保存已加载插件(activePlugins)的列表: ObjectOutputStrea

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

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

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

ObjectOutputStream oos = new ObjectOutputStream(*fileoutputstream*);
oos.writeObject(activePlugins);
oos.close();
ObjectInputStream ois = new ObjectInputStream(*fileinputstream*);
activePlugins = (ArrayList<IPlugin>) ois.readObject();
然后在另一个运行时,使用ObjectInputStream加载/恢复所有这些插件:

ObjectOutputStream oos = new ObjectOutputStream(*fileoutputstream*);
oos.writeObject(activePlugins);
oos.close();
ObjectInputStream ois = new ObjectInputStream(*fileinputstream*);
activePlugins = (ArrayList<IPlugin>) ois.readObject();
ObjectInputStream ois=新ObjectInputStream(*fileinputstream*);
activePlugins=(ArrayList)ois.readObject();

但是,由于实际的对象类在构建路径中不可用(它们在硬盘驱动器的其他地方),因此会出现混乱。我所追求的是在没有可用类的情况下加载对象的某种方式,即加载具有状态且没有依赖项的对象。

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

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


我认为,这是通过某种远程类加载机制实现的。

虽然Java不是我的主要编程框架,但我在其他“框架”如PHP、Delphi和C#中也看到了同样的问题

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


另一个建议是,既然您已经指定了,您就不关心逻辑,只关心(“数据”)状态,您可以声明一个存储属性值的泛型类。

我已经研究了几分钟这个问题。一开始我不理解这个问题,因为他都在谈论状态和方法。我认为听起来他实际上都想要一个自定义类加载器(NetworkClassLoader)和ObjectOutputStream。听起来他想保存插件的状态,而不仅仅是插件。或者说我现在完全不在地图上了?很好的一点,我没有注意到他实际上也希望保存对象状态。更新了我的答案。仅仅为了加载类而使用RMI听起来是错误的。据我所知,他不想执行远程方法。RMI使用Java序列化的注释功能链接到代码的URL(尽管可以关闭)。您还必须序列化流上的类字节。您可以通过
getResourceAsStream
获取类字节,然后在另一端,使用这些字节在自定义类加载器中加载类,然后将结果类强制转换到接口,并通过接口使用对象。