CONTENTS | PREV | NEXT | Java Remote Method Invocation |
java.io.Serializable
interface. For more details on
how to make classes serializable, see the "Java Object
Serialization Specification." Classes, for parameters or return
values, that are not available locally are downloaded dynamically
by the RMI system. See the section on "Dynamic Class Loading" for more
information on how RMI downloads parameter and return value classes
when reading parameters, return values and exceptions.
So, when a non-remote object is passed as an argument or return value in a remote method invocation, the content of the non-remote object is copied before invoking the call on the remote object.
When a non-remote object is returned from a remote method invocation, a new object is created in the calling virtual machine.
java.io.ObjectOutputStream
in order to serialize the
parameters to the destination of the remote call. The
ObjectOutputStream
subclass overrides the
replaceObject
method to replace each exported remote
object with its corresponding stub instance. Parameters that are
objects are written to the stream using the
ObjectOutputStream
's writeObject
method. The ObjectOutputStream
calls the
replaceObject
method for each object written to the
stream via the writeObject
method (that includes
objects referenced by those objects that are written). The
replaceObject
method of RMI's subclass of
ObjectOutputStream
returns the following:
replaceObject
is an instance of
java.rmi.Remote
and that object is exported to the RMI
runtime, then it returns the stub for the remote object. If the
object is an instance of java.rmi.Remote
and the
object is not exported to the RMI runtime, then
replaceObject
returns the object itself. A stub for a
remote object is obtained via a call to the method
java.rmi.server.RemoteObject.toStub
.replaceObject
is not an instance of
java.rmi.Remote
, then the object is simply
returned.ObjectOutputStream
also implements the
annotateClass
method that annotates the call stream
with the location of the class so that it can be downloaded at the
receiver. See the section "Dynamic
Class Loading" for more information on how
annotateClass
is used.
Since parameters are
written to a single ObjectOutputStream
, references
that refer to the same object at the caller will refer to the same
copy of the object at the receiver. At the receiver, parameters are
read by a single ObjectInputStream
.
Any other default
behavior of ObjectOutputStream
for writing objects
(and similarly ObjectInputStream
for reading objects)
is maintained in parameter passing. For example, the calling of
writeReplace
when writing objects and
readResolve
when reading objects is honored by
RMI's parameter marshal and unmarshal streams.
In a similar manner to
parameter passing in RMI as described above, a return value (or
exception) is written to a subclass of
ObjectOutputStream
and has the same replacement
behavior as parameter transmission.