我有一个简单的RMI服务器,它将文件存储在地图中,并在请求时返回它们。存储在地图中的文件类型是Object。我这样做了所以我不需要导入包含存储特定文件的项目的其他部分的库(还有其他方法吗?)。
如果没有导入我不应该没问题,因为存储的类型是Object?与错误同时我得到java Finalizer线程崩溃。这是堆栈:
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)
此处还有一些来自客户端的代码:
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;
我在那里做错了吗?在不需要导入特定类的情况下,它是否应该可以正常使用Object?我过去曾尝试使用安全管理器,但它只会导致更多麻烦,并且必须执行AllPermissions才能工作(在其他项目中)...
崩溃并不总是发生,但必须由RMI引起。
答案 0 :(得分:0)
Map中存储的对象的类型是您放入其中的任何类型,客户端必须通过其CLASSPATH访问的类型。