据我所知,一旦我在两个系统之间建立了 RMI 通信链接,我就可以将实现“远程”的对象传递到采用该类型对象和远端的远程方法之一将只获取新对象的远程接口(interface)(换句话说,它将成为一个新的远程连接,而不是仅仅将对象序列化。)
这是正确的吗?
如果是这样,我假设这与方法签名有关——但我想确切地知道它是如何确定它应该创建一个新的远程对象而不是简单地序列化整个对象。
这真的很难用语言表达。让我试试这个:
假设我有一个客户端和一个服务器系统。在服务器系统上,我创建并发布一个 RMI 对象,在客户端系统上,我检索接口(interface)并可以与服务器系统交互。
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()”方法调用来实际创建远程调用?
最佳答案
这就是所谓的Proxy Pattern .在远程端实例化的事物已生成代码以传输值和激活方法。
java.rmi.Remote 本身只是一个“标记接口(interface)”。您需要一个实现来完成实际工作。看看this JavaCamp tutorial了解更多。
更新:好的,换个方向,是的,您需要序列化对象并通过网络传递。可能最好的办法是完成 Java Tutorial on RMI第一的。但是,基本上,Serializable 是另一个标记接口(interface),它告诉 Java 该对象已准备好转换为内部字符串格式,有点像 XML 或 YAML。只要该对象的类文件可用,该格式就可以在接收端“再水化”到匹配的对象中。
关于java - RMI-如何通过远程方法传递远程对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/774828/