目次 | 前へ | 次へ | Java Remote Method Invocation |
java.io.Serializable
インタフェースを実装した非リモートオブジェクトが含まれます。クラスを直列化可能にする方法の詳細については、「Java オブジェクト直列化仕様」を参照してください。ローカルでは入手できないパラメータまたは戻り値のクラスは、RMI システムによって動的にダウンロードされます。RMI がパラメータ、戻り値、例外を読み取る際にパラメータおよび戻り値のクラスをダウンロードする方法の詳細については、「クラスの動的なロード」のセクションを参照してください。
したがって、リモートメソッド呼び出しで非リモートオブジェクトが返されるとき、非リモートオブジェクトの内容は、リモートオブジェクトの呼び出しが呼び出される前にコピーされます。
リモートメソッド呼び出しから非リモートオブジェクトが戻されるときは、呼び出し側の仮想マシンに新規オブジェクトが作成されます。
java.io.ObjectOutputStream
クラスのサブクラスであるストリームに書き込まれます。ObjectOutputStream
サブクラスは、replaceObject
メソッドをオーバーライドして、エクスポートされた各リモートオブジェクトを対応するスタブインスタンスで置き換えます。オブジェクトであるパラメータは、ObjectOutputStream
の writeObject
メソッドを使ってストリームに書き込まれます。ObjectOutputStream
は、writeObject
メソッドによってストリームに書き込まれた各オブジェクト (書き込まれたオブジェクトによって参照されているオブジェクトも含む) の、replaceObject
メソッドを呼び出します。RMI のサブクラス ObjectOutputStream
の replaceObject
メソッドの戻り値は、次のとおりです。
replaceObject
に渡されたオブジェクトが java.rmi.Remote
のインスタンスであり、そのオブジェクトが RMI ランタイムにエクスポートされた場合、リモートオブジェクトのスタブが返される。オブジェクトが java.rmi.Remote
のインスタンスであり、そのオブジェクトが RMI ランタイムにエクスポートされない場合、replaceObject
はオブジェクト自体を返す。リモートオブジェクトのスタブは、java.rmi.server.RemoteObject.toStub
メソッドへの呼び出しによって取得される。replaceObject
に渡されたオブジェクトが java.rmi.Remote
のインスタンスでない場合は、単にそのオブジェクトが返される。ObjectOutputStream
も annotateClass
メソッドを実装し、クラスが呼び出し側でダウンロードできるように呼び出しストリームにクラスの場所についての注釈を付けます。annotateClass
の使用方法の詳細は、「クラスの動的なロード」のセクションを参照してください。
どのパラメータも同一の ObjectOutputStream
に書き込まれるため、呼び出し側で同じオブジェクトを参照している参照は、受信側でも同じオブジェクトのコピーを参照します。受信側では、パラメータは同一の ObjectInputStream
によって読み取られます。
オブジェクトの書き込み用の ObjectOutputStream
(および読み取り用の ObjectInputStream
) のその他のデフォルトの動作は、パラメータの引き渡しで維持されます。たとえば、オブジェクトの書き込み時の writeReplace
の呼び出し、およびオブジェクトの読み取り時の readResolve
の呼び出しは、RMI のパラメータ整列化および非整列化ストリームで優先されます。
戻り値 (または例外) も上記の RMI でのパラメータの引き渡しと同じ方法で ObjectOutputStream
サブクラスに書き込まれ、パラメータの転送と同じ方法で置き換えられます。