目次 | 前の項目 | 次の項目 | Java Remote Method Invocation |
RMI 呼び出しにおける呼び出しと戻りのデータは、Java オブジェクト直列化プロトコルに従って整形されます。それぞれのメソッド呼び出しの CallData は、Java オブジェクトの出力ストリームに書き込まれ、それには ObjectIdentifier (呼び出しの対象)、Operation (呼び出されるメソッドを表す数値)、Hash (クライアントスタブとリモートオブジェクトスケルトンが共通なスタブプロトコルを使うことを確認する数値)、およびそれに続く Arguments (ない場合もある) が含まれます。JDK 1.1 のスタブプロトコルでは、Operation は rmic が割り当てたメソッド番号を表し、Hash はスタブのインタフェースハッシュであるスタブおよびスケルトンのハッシュを表しています。Java 2 のスタブプロトコル (Java 2 のスタブは
rmic
で-v1.2
オプションを使用して生成される) では、Operation は -1 という値を持ち、Hash は呼び出されるメソッドを表すハッシュになります。ハッシュについては、「RemoteRef
インタフェース」の節で説明されています。
RMI 呼び出しの ReturnValue は、正常か例外かを示すリターンコード、戻り値にタグ付けする UniqueIdentifier (必要ならば DGCAck を送るために使用する)、そして返される結果である、戻り値 Value またはスローされた Exception が続く構成になっています。
CallData:
ObjectIdentifier Operation Hash Argumentsopt
ObjectIdentifier:
ObjectNumber UniqueIdentifier
UniqueIdentifier:
Number Time Count
Arguments:
Value
Arguments Value
Value:
オブジェクト
Primitive
ReturnValue:
0x01 UniqueIdentifier Valueopt
0x02 UniqueIdentifier Exception
注 - デフォルトの直列化では、ObjectIdentifier、UniqueIdentifier、および EndpointIdentifier は書き出されず、それぞれが自分自身の write メソッドを使います。 これは、オブジェクト直列化が使う writeObject ではありません。 それぞれのタイプの識別子の write メソッドは、それぞれのコンポーネントデータを順次出力ストリームへ追加します。
RMI は、ObjectOutputStream
のannotateClass
およびObjectInputStream
のresolveClass
をそれぞれオーバーライドします。各クラスには、コードベースの URL (クラスをロードする元の場所) を使って注釈が付けられています。annotateClass
メソッドでは、クラスをロードしたクラスローダに対し、そのクラスローダのコードベースの URL を問い合わせます。クラスローダが非null
で、非null
コードベースを持っている場合は、そのコードベースは、ObjectOutputStream.writeObject
メソッドを使ってストリームに書き込まれます。 それ以外の場合は、writeObject
メソッドを使って、ストリームにnull
が書き込まれます。注: 最適化のため、「java
」パッケージ内のクラスには、注釈が付けられません。 これは、これらのクラスは受信側が常に利用できるからです。クラスの注釈は、直列化復元中に
ObjectInputStream.resolveClass
メソッドを使って解釈処理されます。resolveClass
メソッドは、最初にObjectInputStream.readObject
メソッドを使って、注釈を読み取ります。注釈 (コードベース URL) が null でない場合は、その URL のクラスローダを取得して、クラスをロードしようとします。クラスは、クラスバイトを取り出すためにjava.net.URLConnection
を使ってロードされます。 これは、Web ブラウザのアプレットクラスローダが使う機構と同じです。