java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassCastException: java.io.ObjectStreamClass cannot be cast to java.lang.String
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:359)
at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)
at com.nxl.smssession.SessionRMI.<init>(SessionRMI.java:33)
at com.nxl.smssession.Main.main(Main.java:33)
Caused by: java.lang.ClassCastException: java.io.ObjectStreamClass cannot be cast to java.lang.String
有人可以解释为什么会发生这种错误
当我正在进行 RMI绑定操作
时,会发生这种情况此问题仅在 SOLARIS 系统上发生,它在Windows和Linux中正常运行
以下是生成此错误的代码
public SessionRMI(String servicename) throws AlreadyBoundException {
SessionImpl service = new SessionImpl();
try {
logger.debug("Publishing the SMS Session endpoint " + servicename);
SessionIface stub = (SessionIface) UnicastRemoteObject.exportObject(service, 0);
Registry registry = LocateRegistry.getRegistry();
registry.rebind(servicename, stub);
logger.debug("SMS Session endpoint published successfully "+servicename);
} catch (RemoteException ex) {
logger.error(ex.toString()); ex.printStackTrace();
}
}
提前致谢
答案 0 :(得分:1)
存根本身无法反序列化。我会仔细检查你的存根类的生成,并确保在Solaris盒子上没有任何旧的.class文件。
答案 1 :(得分:1)
我在RedHat上遇到了这个问题,我认为这可能与我开始错误的rmiregistry版本...
我能够通过编程方式启动注册表来解决此问题。在registry.rebind()
之前添加它java.rmi.registry.LocateRegistry.createRegistry(1099);
答案 2 :(得分:0)
请在(SessionRMI.java:33)向我们提供有问题的代码,以便我们对其进行检查。
如果没有其他信息,我只能说:
施法的Intead尝试对象。<strong> toString ();
ObjectStreamClass osc = new ObjectStreamClass();
String str1 = (String)osc; // Throws ClasCastException
String str2 = osc.toString(); // always works if osc is not null
答案 3 :(得分:0)
看起来你有一个需要String
参数的远程方法,而是你给它一个java.io.ObjectStreamClass
。这当然会引发UnmarshalException
。
您应仔细检查RMI绑定操作尝试,并确保尝试调用正确的方法,并在需要时提供正确的参数。请参阅文档以确认String
参数应该代表什么,并相应地提供它。
答案 4 :(得分:0)
感谢帮助人员。
我自己解决了这个问题。
似乎rmiregistry没有像在windows和linux中那样在solaris系统上启动。
我必须从代码本身手动启动它。