2017-03-23 4 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 객체를 반환하는 한 가지 방법이 있습니다. 그러나 클라이언트에서 해당 메서드를 호출 할 때 예외 아래에 점점. 이 문제를 어떻게 해결합니까? Node가 원격 객체 의도되면

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. :

    • NodeOperationsRemote 연장한다.
    • NodeUnicastRemoteObject으로 확장하거나 UnicastRemoteObject.exportObject()을 통해 내 보내야합니다.
    • NodeOperations.getFingerTable()RemoteException을 던지도록 선언해야합니다.
    • 필드에 Node이 없어야합니다.이 필드의 유형은 NodeOperations이어야합니다.

    예외에 따르면 Node이미 보낸 원격 객체이다. 그래서 이것은 실제 코드가 아닙니다.

  2. 그렇지 않으면 Node 원격 객체가 될하지 않으려면, NodeSerializable를 구현해야 즉,

  3. 당신의 클래스 정의가 아니라 원형 것 등을하는 serialVersionUID 멤버를 선언합니다. 그들을 검토하십시오.