6

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

这个对吗?

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

这真的很难用言语表达。让我试试这个:

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

Client                            Server
Object1 RemoteIface     ----   Object1 Implementation

到目前为止,一切都很好。在客户端上,Object1.remoteMethod() 将在服务器上执行(在对参数进行序列化之后)。

现在,问题来了,在客户端我执行如下代码:

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

据我了解,到那时,我的系统将有一个新的通信机制:

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

此时,如果服务器调用 Object2 上的某个方法,该方法实际上会在客户端上执行。

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

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

4

1 回答 1

6

这就是所谓的代理模式。在远端实例化的事物已经生成了用于传输值和激活方法的代码。

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

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

于 2009-04-21T22:10:31.680 回答