近来看过 HeadFirst EJB 和Master EJB3.0,发现有一个还是以前J2SE的问题不太明白,请大家赐教。
 
我们说RMI在2个不同的JVM(说白了就是不同的堆上)传递对象时候,只能传递2种对象,一种是实现了Serializable接口的对象,一种是实现了Remote接口的对象,我想问一下,这2者是否有什么区别,比如,Remote接口的对象如果不能序列化成bit-blob,又如何能在网络之间传递呢?还有,就是Master ejb3.0上说,RMI上的参数传递有传递值和传递引用2种方式,传递值嘛,很好理解,将一个对象的整个副本序列化之后通过网络传递到网络的另一端,可是,我实在无法理解传递引用,因为,网络的2端根本就是在2个不同的JVM之上了,也就是在2个不同的堆上了,那么1个堆上的地址(引用,比如0X84FF指向一个Pig)在另外一个堆上根本就没有任何意义了啊(目标JVM上的OX84FF也许不指向任何内容)?那么这个引用传递过去有什么意义呢?

解决方案 »

  1.   

    初学EJB。。占个SF期待高手解答。学习学习
      

  2.   


    答:
    1)对于第一问,首先纠正你的一个说法:"我们说RMI在2个不同的JVM(说白了就是不同的堆上)传递对象时候,只能传递2种对象,一种是实现了Serializable接口的对象,一种是实现了Remote接口的对象," 这句话不正确.
     (A)实现了Serializable接口的对象,在RMI上传递上没有问题的
     (B)实现了Remote接口的对象,名字叫远程对象,若没有实现Serializable接口,是不能在RMI上传递的.
     (C)因此:所有的远程对象都最终实现<1>远程接口 及 <2>Serializable接口
      (D)在序列化上两者没有区别.真正的区别反而在于:已导出的远程对象,在RMI中传递的是它的代理,而没有导出过的远程对象,传递是它自身.这才是它的最大区别.2)对于第二问:EJB是建立在RMI之上.远程引用是本地引用(即:大家通常所说的JAVA引用,也即楼主所说的本地JVM中堆的一个地址)在RMI的拓广.它是用RMI系统中的RRL层(远程引用层)来实现的.是一种与实现无关的约定,(说到底:就是远程对象的唯一的一种标识串或称ID),在RemoteObject类中,实现了远程引用与本地引用的相一致的语义(如:两个远程引用是否是引用同一个远程对象?等等)
      

  3.   

    引用
    1)对于第一问,首先纠正你的一个说法:"我们说RMI在2个不同的JVM(说白了就是不同的堆上)传递对象时候,只能传递2种对象,一种是实现了Serializable接口的对象,一种是实现了Remote接口的对象," 这句话不正确. 
    (A)实现了Serializable接口的对象,在RMI上传递上没有问题的 
    (B)只实现了Remote接口的对象,名字叫远程对象,若没有实现Serializable接口,是不能在RMI上传递的. 
    (C)因此:所有的远程对象都最终实现 <1>远程接口 及 <2>Serializable接口 
    -------------------------------------------------------
    刚才查了API 文档,public abstract class RemoteObject extends Object implements Remote, Serializable
    正如楼上所说,远程对象是既实现了Remote接口又实现了Serializable接口,所以他才能在网络上传递。
    我想补充问的是:是不是远程对象(也就相当于真正的Bean的保镖)它本身是无法序列化的,因为远程接口的父接口EJBObject仅仅只扩展了Remote接口。但是,远程对象的桩却额外的实现了Serializable接口,因而了可以序列化的?
    还有,您说的(D)在序列化上两者没有区别.真正的区别反而在于:已导出的远程对象,在RMI中传递的是它的代理,而没有导出过的远程对象,传递是它自身.这才是它的最大区别.  什么是已导出的远程对象
      

  4.   

    导出的远程对象应该就是桩。
    RomoteInterface stub = (RomoteInterface ) UnicastRemoteObject.exportObject(obj, 0);