目次 | 前の項目 | 次の項目 Java Remote Method Invocation


10.3 RMI におけるオブジェクト直列化プロトコルの使用

RMI 呼び出しにおける呼び出しと戻りのデータは、Java オブジェクト直列化プロトコルに従って整形されます。それぞれのメソッド呼び出しの CallData は、ObjectIdentifier (呼び出しの対象)、Operation (呼び出されるメソッドを表す数値)、Hash (クライアントスタブとリモートオブジェクトが共通なスタブプロトコルを使うことを確認する数値)、およびそれに続くArguments (なくてもよい) によって表現されます。

JDK 1.1 のスタブプロトコルでは、Operationrmic が割り当てたメソッド番号を表し、Hash はスタブのインタフェースハッシュであるスタブおよびスケルトンのハッシュを表していました。JDK 1.2 のスタブプロトコル (JDK 1.2 のスタブは rmic-v1.2 オプションを使用して生成される) では、Operation は -1 という値を持ち、Hash は呼び出されるメソッドを表すハッシュになります。ハッシュについては、「RemoteRef インタフェース」の節で説明されています。

CallData: ObjectIdentifier Operation Hash Argumentsopt

ObjectIdentifier: ObjectNumber UniqueIdentifier

UniqueIdentifier: Number Time Count

Arguments: Value Arguments Value

Value: Object Primitive

RMI 呼び出しの ReturnValue は、正常か例外かを示すリターンコード、戻り値にタグ付けする UniqueIdentifier (必要ならば DGCAck を送るために使用する)、そして返される結果である、戻り値 Value またはスローされた Exception が続く構成になっています。

ReturnValue: 0x01 UniqueIdentifier Valueopt 0x02 UniqueIdentifier Exception


注 - デフォルトの直列化では、ObjectIdentifierUniqueIdentifier、および EndpointIdentifier は書き出されず、それぞれが自分自身の write メソッドを使います。これは、オブジェクト直列化が使う writeObject ではありません。それぞれのタイプの識別子の write メソッドは、それぞれのコンポーネントデータを順次出力ストリームへ追加します。

10.3.1 クラスの注釈およびロード

RMI は、ObjectOutputStream および ObjectInputStreamannotateClassresolveClass をそれぞれオーバーライドします。各クラスには、コードベースの URL (クラスをロードする元の場所) を使って注釈が付けられています。annotateClass メソッドでは、クラスをロードしたクラスローダに対し、そのクラスローダのコードベースの URL が照会されます。クラスローダが null ではなく、null でないコードベースを持っている場合は、そのコードベースは、ObjectOutputStream.writeObject メソッドを使ってストリームに書き込まれます。それ以外の場合は、writeObject メソッドを使って、ストリームに null が書き込まれます。注: 最適化のため、java パッケージ内のクラスには、注釈が付けられません。これは、これらのクラスは受信側が常に利用できるからです。

クラスの注釈は、直列化復元中に ObjectInputStream.resolveClass メソッドを使って解釈処理されます。resolveClass メソッドは、最初に ObjectInputStream.readObject メソッドを使って、注釈を読み取ります。注釈 (コードベース URL) が null でない場合は、その URL のクラスローダを取得して、クラスをロードしようとします。クラスは、クラスバイトを取り出すために java.net.URLConnection を使ってロードされます。これは、Web ブラウザのアプレットクラスローダが使う機構と同じです。



目次 | 前の項目 | 次の項目
Copyright © 1997-1998 Sun Microsystems, Inc. All Rights Reserved.