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

Bil*_*l K 6 java rmi

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

它是否正确?

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

这真的很难说.让我试试这个:

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

Client                            Server
Object1 RemoteIface     ----   Object1 Implementation
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.在客户端上,Object1.remoteMethod()将在Server上执行(在序列化参数之后).

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

Object2 object2=new object2(); // Also a remote object
object1.send(object2); 
Run Code Online (Sandbox Code Playgroud)

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

Client                           Server
Object1 RemoteIface    -----    Object1 Implementation
Object2 Implementation -----    Object2 RemoteIface    
Run Code Online (Sandbox Code Playgroud)

此时,如果服务器在Object2上调用方法,则该方法实际上将在客户端上执行.

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

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

Cha*_*tin 6

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

java.rmi.Remote本身只是一个"标记接口".您需要一个实现来完成实际工作.有关更多信息,请查看此JavaCamp教程.

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