精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● Java>>JAVA编程>>网络编程>>RMI>>RMI规范--第二章(5)

主题:RMI规范--第二章(5)
发信人: daystream()
整理人: biubiu(2000-01-02 15:22:02), 站内信件
2.6 远程方法调用中的参数传递
传给远程对象的参数或源于它的返回值可以是任意可序列化的 Java 对象。这包

括 Java 基本类型, 远程?Java 对象和实现 java.io.Serializable 接口的
非远程 Java 对象。有关如何使类序列化的详细信息,参见 Java“对象序列化

规范”。本地得不到的作为参数或返回值的类,可通过 RMI 系统进行动态下载。

有关 RMI 读取参数、返回值和异常时如何下载参数和返回值类的详细信息,参

见“动态类加载”(3.4)一节。

2.6.1 传递非远程对象
非远程对象将作为远程方法调用的参数传递或作为远程方法调用的结果返回时,

是通过复制传递的;也就是使用 Java 对象序列化机制将该对象序列化。 

因此,在远程对象调用过程中,当非远程对象作为参数或返回值传递时,非远程

对象的内容在调用远程对象之前将被复制。 

从远程方法调用返回非远程对象时,将在调用的虚拟机中创建新对象。

2.6.2 传递远程对象
当将远程对象作为远程方法调用的参数或返回值传递时,远程对象的 stub 程序

即被传递出去。作为参数传递的远程对象仅能实现远程接口。

2.6.3 引用的完整性
如果一个对象的两个引用在单个远程方法调用中以参数形式(或返回值形式)从

一个虚拟机传到另一个虚拟机中,并且它们在发送虚拟机中指向同一对象,则两

个引用在接收虚拟机中将指向该对象的同一副本。进一步说就是:在单个远程方

法调用中,RMI 系统将在作为调用参数或返回值传递的对象中保持引用的完整性


2.6.4 类注解
当对象在远程调用中被从一个虚拟机发送到另一个虚拟机中时,RMI 系统在调用

流中用类的信息 (URL) 给类描述符加注解,以便该类能在接收器上加载。在远

程方法调用期间,调用可随时下载类。

2.6.5 参数传输
为将 RMI 调用的参数序列化到远程调用的目的文件里,需要将该参数写入作为 

java.io.ObjectOutputStream 类的子类的流中。ObjectOutputStream 子类
将覆盖 replaceObject 方法,目的是用其相应的 stub 类取代每个远程对象。

对象参数将通过 ObjectOutputStream 的 writeObject 方法写入流中。而
 ObjectOutputStream 则通过 writeObject 方法为每个写入流中的对象(包
含所写对象所引用的对象)调用 replaceObject 方法。RMIObjectOutputStream
 
子类的 replaceObject 方法返回下列值:

如果传给 replaceObject 的对象是 java.rmi.Remote 的实例,则返回远程对
象的 stub 程序。远程对象的 stub 程序通过对 
java.rmi.server.RemoteObject.toStub 方法的调用而获得。 
如果传给 replaceObject 的对象不是 java.rmi.Remote 的实例,则只返回
该对象。 
RMI 的 ObjectOutputStream 子类也实现 annotateClass 方法,该方法用类
的位置注解调用流以便能在接收器中下载该类。有关如何使用 annotateClass 

的详细信息,参见“动态类加载”一节。 

因为参数只写入一个 ObjectOutputStream,所以指向调用程序同一对象的引用

将在接收器那里指向该对象的同一副本。在接收器上,参数将被单个 
ObjectInputStream 所读取。 

用于写对象的 ObjectOutputStream(类似的还有用于读对象的 
ObjectInputStream )的所有其它缺省行为将保留在参数传递中。例如,写对
象时对 writeReplace 的调用及读对象时对 readResolve 的调用就是由 RMI 
的参数编组与解编流完成的。 

与上述 RMI 参数传递方式类似,返回值(或异常)将被写入 ObjectOutputStre
am
 的子类并和参数传输的替代行为相同。


--
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.96.191.124]

[关闭][返回]