【问题标题】:Java RMI ClassCast exceptionJava RMI ClassCasexception
【发布时间】:2017-03-23 03:25:22
【问题描述】:

我正在使用以下 JAVA RMI 设置开发分布式系统。

public interface NodeOperations {
 /* RMI methods */
 public FingerTable getFingerTable() throws RMIException;
}

public class Node implements NodeOperations {
 /* Implements all RMI methods */
 /* Also holds a object of FingerTable */
 FingerTable ft;

}

public class FingerTable {
 /* Holds a reference to Node class which has object of 'this' FingerTable */
 Node self;
}

所有 RMI 通信都是通过 NodeOperations 接口中的方法完成的。有一种方法可以为特定节点返回 FingerTable 对象。但是,当我从客户端调用该方法时,我遇到了异常。我该如何解决这个问题?

java.lang.ClassCastException: cannot assign instance of com.sun.proxy.$Proxy5 to field chord.FingerTable.self of type chord.Node in instance of chord.FingerTable
    at java.io.ObjectStreamClass$FieldReflector.setObjFieldValues(ObjectStreamClass.java:2133)
    at java.io.ObjectStreamClass.setObjFieldValues(ObjectStreamClass.java:1305)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2237)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2155)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2013)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2231)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2155)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2013)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422)
    at sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:326)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:175)
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:227)
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:179)
    at com.sun.proxy.$Proxy5.getNodeInfo(Unknown Source)
    at chord.NodeTest.testTopology(NodeTest.java:108)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

【问题讨论】:

  • 即使我是这么认为的,但我已经使所有这些类都可序列化。
  • 这段代码不会产生这个异常。至少缺少两件事。贴出真实代码。

标签: java rmi


【解决方案1】:
  1. 如果Node 打算成为一个远程对象:

    • NodeOperations 应该扩展 Remote
    • Node 应该扩展 UnicastRemoteObject 或通过 UnicastRemoteObject.exportObject() 导出。
    • NodeOperations.getFingerTable() 应该声明为 throw RemoteException
    • 您不应该有 Node 类型的字段:它应该是 NodeOperations 类型的字段。

    根据例外情况,Node 已经是一个导出的远程对象。所以这不是真正的代码。

  2. 否则,即如果您不希望Node 成为远程对象,则Node 应实现Serializable,声明serialVersionUID 成员等。

  3. 您的类定义似乎相当循环。查看它们。

【讨论】:

    猜你喜欢
    • 2018-10-31
    • 2011-06-26
    • 1970-01-01
    • 2010-09-29
    • 2017-01-19
    • 2011-07-26
    • 2012-07-01
    • 2016-05-26
    • 2021-11-15
    相关资源
    最近更新 更多