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?
没有
我有以下代码:
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?
没有