对于RMI的远程接口方法来说,传入参数或返回值可以是任何类型,包括本地对象,远程对象以及原始数据类型。更准确地说,任何类型的任何实体(可理解为类和对象的关系)都能被传入或传出远程方法,只要该实体是以下类型的实例:原始数据类型,远程对象,或者可串行化对象,即实现了接口java.io.Serializable。
但是有些对象类型却不满足以上这些要求,因而不能被传入或传出。比如,线程或者文件描述符(还有inputstream,outputstream对象),因为封装了仅仅存在于单一地址空间的信息,这样便无法通过RMI传递。另外许多核心类,包括位于java.lang和java.util包下的类都是实现了Serializable接口的。
怎样传递参数和返回值的规则,介绍如下:
1.远程对象是引用传递。
这个引用就是位于client端的stub,起着代理的作用,远程对象实现了的远程接口,作为代理的stub也全部实现;
2.本地对象是值传递,即拷贝。
缺省的话,所有的属性都会被拷贝,除了标示为static或transient的属性之外。这种缺省行为是可以在类里被覆盖的。
远程对象的引用传递意味着对远程方法调用的对象的状态所作的任何改变都将反映到该stub所对应的远程对象上去。当一个远程对象被传递时,接受者只能看到远程接口里定义的方法,而不能看到远程对象里定义的本地方法。
本地对象的值传递意味着任何对接受者的对象的状态的改变都不会影响到发送者那里的对象,反之亦然。