0

次のように定義された RMI 呼び出しがあります。

public void remoteGetCustomerNameNumbers(ArrayList<String> customerNumberList, ArrayList<String> customerNameList) throws java.rmi.RemoteException;

この関数はデータベース ルックアップを実行し、2 つの ArrayLists に値を設定します。呼び出し関数は何も取得しません。これは Vector 型で機能すると思います。

Vector を使用する必要がありますか、または 2 つの呼び出しを行わずにこれを機能させる方法はありますか。キーと値のペアを返すなど、おそらく使用する他のアイデアがいくつかありますが、これを機能させることができるかどうか知りたいです。

更新:
可能であれば、これまでに与えられたすべての回答を受け入れます。私はネットワーク コストを知らなかったので、2 つの ArrayList の代わりに LinkedHashMap を返すように関数を作り直すことは理にかなっています。

4

4 に答える 4

2

RMI 呼び出しの引数はシリアライズされています。サーバー上で逆シリアル化すると、リストのコピーが作成されます。リストがクライアント側に残っていると、ネットワーク呼び出しの数が非常に多くなります。リモート オブジェクトを渡すことができますが、パフォーマンスへの影響に注意してください。

于 2008-09-17T16:45:01.627 に答える
1

リモート呼び出しを行うと、参照が失われます。リモート呼び出しによってリストが作成されることを期待するのではなく、リストを返す必要があります。

于 2008-09-17T16:37:55.637 に答える
1

他の人が既に述べたように、オブジェクトをパラメーターとして RMI メソッドに渡すと、オブジェクトはシリアル化され、RMI メソッドを含むターゲット オブジェクト内の反対側で逆シリアル化されます。これにより、渡された元のオブジェクトからの参照が壊れます。これは、メソッドを呼び出すクライアント コードとリモート側に 1 つずつ、2 つの異なるオブジェクトがあるためです。

この特定の例では、メソッド呼び出しを分割し (1 つのメソッドで顧客名の取得と顧客番号の取得という 2 つのことを行っているように見えるため)、代わりに結果を渡すのではなく、呼び出し元に返すことをお勧めします。コレクション...次のように:

public ArrayList<String> getCustomerNames() throws java.rmi.RemoteException;

public ArrayList<String> getCustomerNumbers() throws java.rmi.RemoteException;

ArrayList と String の両方が Serializable を実装しているため、コレクションの結果はシリアル化され、メソッドを呼び出すクライアント コードに送信されます。この時点で、必要に応じてデータを操作できます。代わりに、コレクション内のカスタム オブジェクトを使用する必要がある場合、クラスが java.io.Serializable インターフェイスを実装し、そのインターフェイスの仕様に従っている限り、問題は発生しません。

これにより、ワイヤを介した 2 つの個別の呼び出しが発生しますが、よりクリーンでシンプルな相互作用であり、元の例での参照の破損の問題を回避できます。

于 2008-09-17T19:43:04.693 に答える
1

Tom が言及しているように、リモート オブジェクトを渡すことができます。Remote を実装するリストを保持するクラスを作成する必要があります。Remote を実装する何かを引数として渡すと、受信側がそれを使用するたびに、受信側が向きを変えて呼び出し元にリモート コールバックを行い、そのオブジェクトを操作します。

于 2008-09-17T18:47:26.777 に答える