Java 我的项目必须知道我所创建的类的具体类型';我要反序列化吗?

Java 我的项目必须知道我所创建的类的具体类型';我要反序列化吗?,java,serialization,classpath,Java,Serialization,Classpath,我计划定义一个接口I,该接口将由许多对象共享,这些对象将由我的服务器序列化到客户端。这样做的想法是,客户机只知道接口,而不必费心了解I的任何具体实现 问题似乎是这似乎是不可能的,因为在反序列化时,Java需要在其类路径中找到我要反序列化的类 有其他选择吗?客户机的虚拟机从哪里获得实现的字节码?除非您希望开始跨线路发送具体的实现类,否则这种方法是行不通的。客户机将需要具体的实现。是的,客户机将需要其类路径中的具体实现。通常,将所有实现包含在客户机JAR中是最简单的。在某些极端情况下,让实现可以动态

我计划定义一个接口
I
,该接口将由许多对象共享,这些对象将由我的服务器序列化到客户端。这样做的想法是,客户机只知道接口,而不必费心了解
I
的任何具体实现

问题似乎是这似乎是不可能的,因为在反序列化时,Java需要在其类路径中找到我要反序列化的类


有其他选择吗?

客户机的虚拟机从哪里获得实现的字节码?除非您希望开始跨线路发送具体的实现类,否则这种方法是行不通的。客户机将需要具体的实现。

是的,客户机将需要其类路径中的具体实现。通常,将所有实现包含在客户机JAR中是最简单的。在某些极端情况下,让实现可以动态加载可能是有意义的,在这种情况下,您可以使用rmi的远程类加载功能(注意,这通常很难设置,不值得付出努力)。

这很大程度上取决于类必须以功能的方式实现什么

如果您的类只不过是一个包含数据的bean,那么您的客户机代码可以使用ASM和其他动态运行时字节码操作技术。我最近用的一个很好的例子是杰克逊的憨豆先生。它只需要一个非常简单的界面就可以动态创建整个bean

如果您需要在类中具有实际的功能,而该功能不在客户机中,那么我希望您需要研究序列化一个类,将其发送到网络上,然后可能是某种自定义类加载器,它可以从反序列化的数据加载一个类