【问题标题】:RMI-How does passing a remote object through a remote method work?RMI-如何通过远程方法传递远程对象?
【发布时间】:2009-04-21 22:01:16
【问题描述】:

据我了解,一旦我在两个系统之间建立了 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()”方法调用来实际创建远程调用?

【问题讨论】:

    标签: java rmi


    【解决方案1】:

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

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

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

    【讨论】:

    • 听起来查理正在像我一样解释你的问题,并且他的回答是正确的。如果您传递一个实现 Remote 的参数(或返回一个对象),则会创建一个动态代理骨架,并发送寻址该骨架的端点信息(有点像“引用”而不是“值”)。在接收方,会创建一个动态代理存根来与远程对象通信。远程而不是序列化的决定基于远程接口。
    • 好的,听起来您确实做对了,我只是浪费了很多时间来重写我的问题。但是你能在“RemoteInterface”部分更明确吗?如果我只是将它强制转换为远程接口,这会导致它将接口与实现分开,还是必须通过方法调用?
    • 用相反的术语来说——我需要做些什么不同的事情才能让它通过现有的远程方法序列化整个远程对象,以便发送整个东西而不是创建骨架?如果我将它作为可序列化而不是远程传递,会这样做吗?
    • 所以我想我明白了——这真的在于它是如何投射的。如果我错了,请纠正我,但是如果您有一个既可序列化又可远程的对象,将其传递给采用可序列化的远程方法与将其传递给采用“远程”的远程方法具有完全不同的效果“ 争论。这是有道理的,但感觉违反直觉,因为您会认为简单的投射不会产生如此显着的效果。
    • 好吧,有点。教程可以更详细地介绍,但接口就是契约;如果你 cast 到 Serializable 但还没有真正实现它,你可能会感到惊讶。特别是,您必须有一个默认的 ctor,它不需要任何参数。看看接口 javadoc:java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html 但是,是的,你有两个选择:Remote,它构造一个代理,Serializable,它传输一个副本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 2015-07-01
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多