0

ファイルをマップに保存し、要求されたときにそれらを返す単純な RMI サーバーがあります。マップに格納されるファイルのタイプは Object です。私はこれを行ったので、保存された特定のファイルを含むプロジェクトの他の部分でライブラリをインポートする必要はありません(それを行う他の方法はありますか?)。

格納されている型はオブジェクトなので、インポートしなくても大丈夫ではないでしょうか? エラーと同時に、 java Finalizer thread crash が発生しています。スタックは次のとおりです。

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: util.MyClass (no security manager: RMI class loader disabled)
Invalid memory access of location 0x0 rip=0x7fff91016390 <<< this is from crash
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:334)
    at sun.rmi.transport.Transport$1.run(Transport.java:159)
    at java.security.AccessController.doPrivileged(Native Method)

また、 Client からのコードの一部を次に示します。

public void uploadProjects(List<MyClass> projects) {
        try {
            Object obj = projects;
            rmiServer.upload(channel, obj); // <<<< exception on this line
        } catch (RemoteException ex) {
            Logger.getLogger(RMIClient.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

そして、ここにインターフェースメソッドがあります:

void upload(String channel, Object projects) throws RemoteException;

私はそこで何か間違ったことをしていますか?特定のクラスのインポートを必要とせずにオブジェクトで正常に動作するべきではありませんか?また、過去にセキュリティマネージャーを使用しようとしましたが、それはより多くの問題につながるだけであり、それが機能するために AllPermissions を実行する必要がありました(他のプロジェクトで)...

クラッシュは常に発生するわけではありませんが、RMI が原因である必要があります。

4

1 に答える 1

0

Map に格納されるオブジェクトの型は、その中に入れたものであり、どの型であってもクライアントはその CLASSPATH を介してアクセスできる必要があります。

于 2012-04-06T00:37:00.600 に答える