2016-08-08 8 views
0

は、私は、次のコードを持っている:私はfooが何とかシリアライズとRMIクライアントにRMIサーバから送信されます理解したようRMI:リモートオブジェクトのフィールドがシリアル化され、クライアントに送信されますか?

public class Foo implements SomeRemote { 
    private String verySecretString; 
    public void doSomething(){...} 
} 

。だから、クライアントはとにかくverySecretStringにアクセスできますか?

+0

直列化は、一般的に深いコピーをしない - あなたが送信されるかを確認するためにテストしていますか? –

+1

@ DavidT.Macknet Serialization *はディープコピーを行いますが、常にここにはシリアル化はありません。 – EJP

+0

興味深いもので、他の言語の場合は公表されません。私はそれを電線の下に送るためにいくつかのシリアル化が必要であると仮定しますが、ちょっと、私の言葉ではありません。 –

答えて

1

私はfooが何とかRMIサーバからのRMI CLIEにシリアライズして送信されます理解でnt。

いいえ。Fooがエクスポートされたリモートオブジェクトの場合は、どこにも送信されません。そのスタブが送信されます。

したがって、クライアントはとにかくverySecretStringにアクセスできますか?

+0

深いコピーではないようなサウンド。 ;) –

+0

@ DavidT.Macknetこれはプロキシパターンです。深いか浅いコピー、またはあらゆる種類のコピーを行うことはありません。それはRMIによって行われ、シリアル化によっては行われません。 – EJP

+0

私はあなたのことを正しく理解していますか?クライアントは 'Foo'のインスタンスにアクセスすることはできません。クライアントは' SomeRemote'インタフェースを実装するスタブにアクセスできますか? –

2

これはどのように動作するのではなく、クラスの代わりにリモートインターフェイスを公開し、クライアントが実装の詳細を知らないこのようにクライアントレベルでインターフェイスを操作するはずです。

だからここにあなたがむしろのようなものを持っている必要があります。

public interface MyService extends Remote { 
    void doSomething() throws RemoteException; 
} 

これは、クライアントレベルで知っているだけです。あなたは、フィールドの値がその宣言にキーワードtransientを追加するだけでシリアル化する必要がない場合

public class Foo implements MyService { 
    private String verySecretString; 
    public void doSomething(){...} 
} 

レスポンス更新:サーバレベルでは、あなたの実装Foo、何かのようになります次のように:

private transient String verySecretString; 
関連する問題