目次|| Java Remote Method Invocation


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

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

JDK 1.1のスタブ・プロトコルでは、Operationrmicが割り当てたメソッド番号を表し、Hashはスタブのインタフェース・ハッシュであるスタブおよびスケルトンのハッシュを表しています。Java 2のスタブ・プロトコル(Java 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は、ObjectOutputStreamannotateClassメソッドおよびObjectInputStreamresolveClassメソッドをそれぞれオーバーライドします。各クラスには、コード・ベースのURL (クラスをロードする元の場所)を使用して注釈が付けられています。annotateClassメソッドでは、クラスをロードしたクラス・ローダーに対し、そのクラス・ローダーのコード・ベースのURLを問い合わせます。クラス・ローダーが非nullで、非nullコード・ベースを持っている場合は、そのコード・ベースは、ObjectOutputStream.writeObjectメソッドを使用してストリームに書き込まれます。それ以外の場合は、writeObjectメソッドを使用して、ストリームにnullが書き込まれます。注意: 最適化のため、「java」パッケージ内のクラスには、注釈が付けられません。これは、これらのクラスは受信側が常に利用できるからです。

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



目次||
Copyright © 1997, 2010, Oracle and/or its affiliates. All rights reserved.