Java RMI:将非远程对象类传递给服务器

Java RMI:将非远程对象类传递给服务器,java,rmi,Java,Rmi,假设我有一个远程类,它有一个带有POJO参数的方法: class MyRemote implements Remote { void service(Param param) throws RemoteException; } 客户端检索存根并执行以下操作: // DerivedParam is defined by the client // and is derived from Param DerivedParam dparam = getDerivedParam(); my

假设我有一个远程类,它有一个带有POJO参数的方法:

class MyRemote implements Remote {

    void service(Param param) throws RemoteException;

}
客户端检索存根并执行以下操作:

// DerivedParam is defined by the client
// and is derived from Param
DerivedParam dparam = getDerivedParam();
myService.service(dparam);
它失败了,因为服务器没有关于DerivedParam类(以及它可能实现的接口)的线索


问题是:是否可以通过某种方式将这些类从客户端传递到服务器,从而使这样的调用成为可能?

我不是这方面的专家,但我确实在一段时间前使用了这个技巧。神奇之处在于通过设置
java.rmi.server.codebase
属性来使用

您可以使此属性指向共享类可能驻留的URL或以空间分隔的URL列表。例如,这可能是一个FTP服务器或HTTP服务器,其中有一个包含公共类的jar文件

一旦设置好,代码库注释将包含在服务器和客户端封送的所有对象中,当任何一方都找不到类时,他们会在代码库中提供的URL中查找并动态加载它

请阅读

假设您只向客户机提供接口,实现将位于给定的代码库中。然后客户端请求服务器发送一个给定的对象,客户端希望接收一个实现给定接口的对象,但是客户端不知道实际的实现,当它对发送的对象进行反序列化时,它必须转到代码库并为正在传递的实际对象下载相应的实现类

这将使客户机非常精简,并且您将非常轻松地更新代码库中的类,而无需更新每个客户机

假设您有一个具有以下接口的RMI服务器

public interface MiddleEarth {
     public List<Creature> getAllCreatures();
}
公共接口MiddleEarth{
公共列表getAllBiotes();
}
客户端将只具有
MiddleEarth
bioture
的接口,但在类路径中没有任何实现

其中,
生物
的实现是
Elf
矮人
霍比特人
类型的可序列化对象。这些实现位于代码库中,但不在客户机的类路径中

当您要求RMI服务器向您发送中土世界所有生物的列表时,它将发送实现
生物
的对象,即上面列出的任何类别

当客户机接收到序列化对象时,它必须查找类文件以对其进行反序列化,但这些文件不位于本地类路径中。此流中的每个对象都带有给定的代码基标记,可用于查找缺少的类。因此,客户机求助于代码库来查找这些类。在那里它会找到实际使用的生物种类

代码库在两个方向上工作,因此这意味着如果您向服务器发送一个
生物
(即
Ent
),它也会在代码库中查找它


这意味着,当客户端和服务器都需要发布新类型的生物时,他们所要做的就是更新代码库中的
CreatureSimple.jar
,而服务器或客户端应用程序本身则不更新任何内容。

我不是这方面的专家,但我确实在不久前玩过这个把戏。神奇之处在于通过设置
java.rmi.server.codebase
属性来使用

您可以使此属性指向共享类可能驻留的URL或以空间分隔的URL列表。例如,这可能是一个FTP服务器或HTTP服务器,其中有一个包含公共类的jar文件

一旦设置好,代码库注释将包含在服务器和客户端封送的所有对象中,当任何一方都找不到类时,他们会在代码库中提供的URL中查找并动态加载它

请阅读

假设您只向客户机提供接口,实现将位于给定的代码库中。然后客户端请求服务器发送一个给定的对象,客户端希望接收一个实现给定接口的对象,但是客户端不知道实际的实现,当它对发送的对象进行反序列化时,它必须转到代码库并为正在传递的实际对象下载相应的实现类

这将使客户机非常精简,并且您将非常轻松地更新代码库中的类,而无需更新每个客户机

假设您有一个具有以下接口的RMI服务器

public interface MiddleEarth {
     public List<Creature> getAllCreatures();
}
公共接口MiddleEarth{
公共列表getAllBiotes();
}
客户端将只具有
MiddleEarth
bioture
的接口,但在类路径中没有任何实现

其中,
生物
的实现是
Elf
矮人
霍比特人
类型的可序列化对象。这些实现位于代码库中,但不在客户机的类路径中

当您要求RMI服务器向您发送中土世界所有生物的列表时,它将发送实现
生物
的对象,即上面列出的任何类别

当客户机接收到序列化对象时,它必须查找类文件以对其进行反序列化,但这些文件不位于本地类路径中。此流中的每个对象都带有给定的代码基标记,可用于查找缺少的类。因此,客户机求助于代码库来查找这些类。在那里它会找到实际使用的生物种类

代码库在两个方向上工作,因此这意味着如果您向服务器发送一个
生物
(即
Ent
),它也会在代码库中查找它

这意味着