2017-03-23 62 views
-1

我正在开发一个使用以下JAVA RMI设置的分布式系统。Java RMI ClassCast异常

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) 
+0

即使我这么认为,但我已经使所有这些类可序列化。 – Nullpointer

+0

此代码不会产生此异常。至少缺少两件事。发布真实的代码。 – EJP

回答

1
  1. 如果Node旨在是远程对象:

    • NodeOperations应该扩展Remote
    • Node应延伸UnicastRemoteObject或通过UnicastRemoteObject.exportObject()出口。
    • NodeOperations.getFingerTable()应宣布投掷RemoteException
    • 您不应该有一个Node类型的字段:它应该是NodeOperations类型。

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

  2. 否则,即如果你不想Node是远程对象,Node应该实现Serializable,声明serialVersionUID构件等

  3. 你的类定义看起来比较圆。审查他们。