RMI:远程对象的字段是否序列化并发送给客户端?

RMI: are fields of remote object serialized and sent to client?

我有以下代码:

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

据我所知,foo 将以某种方式被序列化并从 RMI 服务器发送到 RMI 客户端。那么,客户端还能访问吗verySecretString?

这不是它的工作原理,你应该公开一个远程接口而不是 class 然后在客户端操作接口,这样客户端不知道实现细节。

所以在这里你应该有这样的东西:

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

这只是您在客户端级别所知道的。在服务器级别,您将实现 Foo,类似于:

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

响应更新:

如果您不想序列化字段值,只需将关键字 transient 添加到其声明中,如下所示:

private transient String verySecretString;

As I understand foo will somehow be serialized and sent from RMI server to RMI client.

没有。如果 Foo 是一个导出的远程对象,它不会被发送到任何地方。它的存根将被发送。

So, can the client access anyway verySecretString?

没有