RMI-如何通过远程方法传递远程对象?

时间:2009-04-21 22:01:17

标签: java rmi

据我了解,一旦我在两个系统之间建立了RMI通信链接,我就可以将实现“Remote”的对象传递给一个远程方法,该方法接受该类型的对象和远端将只获得新对象的远程接口(换句话说,它将成为一个新的远程连接,而不是仅仅将对象序列化。)

这是对的吗?

如果是这样,我认为这与方法签名有关 - 但我想知道它究竟是如何确定它应该创建一个新的远程对象而不是简单地序列化整个对象。

这很难说出来。让我试试这个:

假设我有一个客户端和一个服务器系统。在服务器系统上,我创建并发布RMI对象,在客户端系统上,我检索接口并可以与服务器系统进行交互。

Client                            Server
Object1 RemoteIface     ----   Object1 Implementation

到目前为止一切顺利。在Client上,Object1.remoteMethod()将在Server上执行(在序列化参数之后)。

现在,问题是,在客户端我执行这样的代码:

Object2 object2=new object2(); // Also a remote object
object1.send(object2); 

据我了解,此时,我的系统将有一个新的通讯机制:

Client                           Server
Object1 RemoteIface    -----    Object1 Implementation
Object2 Implementation -----    Object2 RemoteIface    

此时,如果服务器在Object2上调用一个方法,那么该方法实际上将在客户端上执行。

我想知道系统在什么时候决定这样做而不仅仅是序列化(就像使用任何非远程对象一样)。

或者我完全错了,它只是序列化它,我需要某种“getRemoteInterface()”方法调用来实际创建远程调用?

1 个答案:

答案 0 :(得分:6)

这就是所谓的Proxy Pattern。在远程端实例化的东西生成了传输值和激活方法的代码。

java.rmi.Remote本身只是一个“标记接口”。您需要一个实现来完成实际工作。请查看this JavaCamp tutorial了解更多信息。

更新:好的,转向另一个方向,是的,您需要序列化对象并通过线路传递。可能最好的办法是首先完成Java Tutorial on RMI。但是,基本上,Serializable是另一个标记接口,告诉Java该对象准备转换为内部字符串格式,有点像XML或YAML。只要该对象的类文件可用,该格式就可以“重新水合”到接收端的匹配对象中。