2017-03-23 23 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オブジェクトを返すメソッドが1つあります。しかし、クライアントからそのメソッドを呼び出すと、私は例外以下になります。この問題をどうやって解決するのですか? 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

このコードではこの例外は発生しません。少なくとも2つのものが欠けている。実際のコードを投稿してください。 – EJP

答えて

1
    • NodeOperationsRemoteを拡張しなければなりません。
    • Nodeは、UnicastRemoteObjectを延長するか、UnicastRemoteObject.exportObject()でエクスポートする必要があります。
    • は、RemoteExceptionをスローするように宣言する必要があります。
    • Nodeのフィールドはありません。タイプはNodeOperationsである必要があります。

    例外によれば、Nodeは既にエクスポートされたリモートオブジェクトです。これは実際のコードではありません。

  1. そうでない場合、あなたはNodeは、リモートオブジェクトにしたくない場合は、NodeSerializableを実装する必要があり、すなわち、

  2. は、あなたのクラス定義ではなく、円形のように見えるなど、serialVersionUIDメンバーを宣言します。それらをレビューする。