1

RMIアプリケーションがあります。詳細は以下のとおりです。サーバーは、DocumentProviderオブジェクトを作成していることを認識し、Documentインターフェイスを使用してそのオブジェクトへの参照をクライアントに渡します。クライアントがDocumentオブジェクトをサーバーに渡すと、サーバーはこれをDocumentProviderにキャストできなくなりますが、これはサーバーが最初に作成したものです。

この種のキャストを行う方法はありますか?つまり、サーバーは、より多くの内部機能(この場合はInternalClass serverInfo)を使用してDocumentの特定の実装を作成していることを認識しており、Document関数の実装でこれらの追加機能にアクセスしたいと考えています。 (この場合、「doCast()」関数内)。

別の質問方法:サーバーがDocumentProviderオブジェクトを作成したら、そのオブジェクトはサーバー上にありますか?もしそうなら、どうすればクライアントにそれへの参照を与えることができますか?InternalClass serverInfo; 一部はシリアル化できず、クライアントに転送できません。(ファイルハンドルなどのようなものですが、DocumentProviderクラス内で保持および管理できます)。

//Interface
public interface Document extends extends java.rmi.Remote {
        public String doSomething()  throws java.rmi.RemoteException;
        public String doCast()  throws java.rmi.RemoteException;
}

//The server:
    public class DocumentProvider extends java.rmi.server.UnicastRemoteObject implements java.rmi.Remote, Document {
        InternalClass serverInfo;

        public String doSomething()  throws java.rmi.RemoteException {
            return "DocumentProvider doing something";
        }
        public String doCast(Document d)  throws java.rmi.RemoteException {
            DocumentProvider d2 = (DocumentProvider) d; // this cast fails, even when d was a DocumentProvider class
            // then access d.serverInfo, etc.
        }
    }

public interface DocumentFactory extends extends java.rmi.Remote {
        public Document createDocument() throws java.rmi.RemoteException;
}
public class DocumentProvider extends java.rmi.server.UnicastRemoteObject implements java.rmi.Remote, DocumentFactory {
    public Document createDocument() throws java.rmi.RemoteException {
        return new DocumentProvider();
    }
}

//Client app:
main()... {
    DocumentFactory dFactory = (lookup/resolve this; this works ok);
    Document dMain = dFactory.createDocument();
    dMain.doCast(dMain);  // this fails because
}

詳細に説明すると、「InternalClass serverInfo」はシリアル化できないサードパーティの「ハンドル」であるため、サーバー内でその状態を維持する必要があるため、主な質問は、リモートオブジェクトへの参照を返し、クライアントを許可しながら、その状態を維持する方法です。インターフェイスで定義されたリモート呼び出しを介してその内部オブジェクトを「操作」します。(もう1つの簡単な例:serverInfoがファイルハンドルであり、クライアントがドキュメントインターフェイスを介して「シーク」および「読み取り」機能を実行できるようにする場合)

4

1 に答える 1

1

リモートオブジェクトは、同じリモートインターフェイスを実装するスタブとして渡されて返されます。したがって、実際のリモートオブジェクトクラスへのキャストは機能しない可能性があり、リモートでキャストしようとしても意味がありません。スタブをインターフェイスのインスタンスとして使用するだけです。それだけでは不十分な場合は、デザインに問題があります。

于 2012-12-17T22:13:07.170 に答える