Java RMI远程对象强制转换/状态



我有一个RMI应用程序,详细信息如下。服务器知道它正在创建一个DocumentProvider对象,并使用Document接口将对该对象的引用传递给客户端。当客户端将Document对象传递给服务器时,服务器不能再将其强制转换为DocumentProvider,尽管这是服务器最初创建的。

有没有一种方法可以进行这种强制转换,即服务器知道它正在创建一个具有更多内部功能的Document的特定实现(在本例中为InternalClass serverInfo),并希望在其Document函数的实现中访问这些附加功能(在本案中为"doCast()"函数)。

另一种提问方式是:一旦服务器创建了DocumentProvider对象,该对象是否位于服务器上?如果是这样,我该如何向客户提供参考?InternalClass服务器信息;部分不可序列化,无法传输到客户端。(有点像文件句柄等,不过我可以在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"是一个不可串行化的第三方"句柄",我必须以某种方式将其状态保留在服务器中,因此主要问题是如何做到这一点,同时返回对远程对象的引用,允许客户端通过接口中定义的远程调用"操纵"该内部对象。(另一个更简单的例子:如果serverInfo是一个文件句柄,并且我允许客户端通过Document接口执行"查找"one_answers"读取"功能)

远程对象作为实现相同远程接口的存根进行传递和返回。因此,转换到实际的远程对象类是不可能的,尝试远程执行更没有意义。只需将存根用作接口的实例。如果这还不够的话,那就是你的设计出了问题。

最新更新