6

私が理解しているように、2つのシステム間にRMI通信リンクを設定すると、「リモート」を実装するオブジェクトを、そのタイプのオブジェクトを取得するリモートメソッドの1つに渡すことができ、遠端は取得します。新しいオブジェクトのリモートインターフェイス(つまり、オブジェクトをシリアル化するだけでなく、新しいリモート接続になります)。

これは正しいです?

もしそうなら、これはメソッドのシグネチャと関係があると思いますが、オブジェクト全体を単にシリアル化するのではなく、新しいリモートオブジェクトを作成する必要があると判断する方法を正確に知りたいと思います。

これを言葉にするのは本当に難しいです。これを試してみましょう:

クライアントとサーバーシステムがあるとしましょう。サーバーシステムでは、RMIオブジェクトを作成して公開し、クライアントシステムでは、インターフェイスを取得して、サーバーシステムと対話できます。

Client                            Server
Object1 RemoteIface     ----   Object1 Implementation

ここまでは順調ですね。クライアントでは、Object1.remoteMethod()がサーバー上で実行されます(パラメーターをシリアル化した後)。

さて、ここに質問があります。クライアントで次のようなコードを実行します。

Object2 object2=new object2(); // Also a remote object
object1.send(object2); 

私が理解しているように、その時点で、私のシステムには新しい通信メカニズムがあります。

Client                           Server
Object1 RemoteIface    -----    Object1 Implementation
Object2 Implementation -----    Object2 RemoteIface    

この時点で、サーバーがObject2のメソッドを呼び出すと、そのメソッドは実際にはクライアントで実行されます。

システムが(リモート以外のオブジェクトの場合のように)単にシリアル化するのではなく、どの時点でこれを実行することを決定するのか疑問に思っています。

または、私は完全に間違っていて、それをシリアル化するだけで、実際にリモート呼び出しを作成するには、ある種の「getRemoteInterface()」メソッド呼び出しが必要ですか?

4

1 に答える 1

6

これは、プロキシパターンと呼ばれるものです。リモートエンドでインスタンス化されたものは、値を転送してメソッドをアクティブ化するためのコードを生成しました。

java.rmi.Remote自体は単なる「タグ付けインターフェース」です。実際の作業を行うには実装が必要です。詳細については、このJavaCampチュートリアルをご覧ください。

更新:わかりました、反対方向に進みます。はい、オブジェクトをシリアル化し、ネットワークを介する場合は渡す必要があります。おそらく最良のことは、最初にRMIのJavaチュートリアルを実行することです。ただし、基本的に、Serializableは、オブジェクトがXMLやYAMLのような内部文字列形式に変換される準備ができていることをJavaに通知する別のタグ付けインターフェイスです。そのオブジェクトのクラスファイルが利用可能である限り、そのフォーマットは受信側で一致するオブジェクトに「再水和」することができます。

于 2009-04-21T22:10:31.680 に答える