# RMI -  java.lang.ClassCastException



## Tasm-Devil (27. Mai 2010)

Hallo zunächst mal,

die letzten beiden Tage (und Nächte) bin ich dabei mich mit RMI anzufreunden, soweit klappt es ganz gut, wenn da nicht auf einmal ein kleines Problemchen auftreten würde. Seit 5 Stunden sitze ich vor dem PC und bekomms nicht gebacken.

Also: Mein Interface und meinen Server und meinen Client habe ich und auch die Verbindung steht. Beide greifen auf die gleichen Interface-Klassen zu und auch Methodenaufrufe funktionieren.

Jetzt möchte ich eine total primitive Klasse "Movie", welche ebenfalls sowohl Server als auch Client bekannt ist als RÜCKGABEWERT einer Funktion an den Client zurückgeben.

```
//Klasse Movie (das ist nicht die Klasse mit der ich mich bei der rmiregistry anmelde)

package main;

import java.io.Serializable;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class Movie extends UnicastRemoteObject implements MovieInterface, Serializable{

	private static final long serialVersionUID = 1L;
	private int id;

	public Movie(int i) throws RemoteException {
		this.id = i;
	}

	public int getid() throws RemoteException{
		return this.id;
	}

}
```

Ich habe alles probiert und nichts hilft. Sogar ein extra Interface, also "MovieInterface" habe ich erstellt


```
// MovieInterface
package main;

import java.io.Serializable;
import java.rmi.Remote;
import java.rmi.RemoteException;



public interface MovieInterface extends Remote, Serializable {
    public int getid() throws RemoteException;
    public int setid() throws RemoteException;
}
```

trotz allen Versuchen kommt nach dem ervolgreichen anmelden am Server folgende Fehlermeldung (ab Zeile 4):


```
Welcome you are logged in TESTTEST
Lets try to get a UPA
Proxy[UnpriviledgedAccess,RemoteObjectInvocationHandler[UnicastRef [liveRef: [endpoint:[131.246.231.87:3022](remote),objID:[4d286b96:128d7067354:-7fd9, 5319042716218521974]]]]]
Exception in thread "main" java.lang.ClassCastException: $Proxy2 cannot be cast to main.Movie
    at $Proxy1.getMovieById(Unknown Source)
    at rmi.RmiControllerClient.start(RmiControllerClient.java:25)
    at main.Client.main(Client.java:16)
```

Woher kommt das? Ich habe Stundenlang gegooglet und komme auch auf Tipps, die aber meistens daher rühren, dass die Leute ein "extends Remote" vergessen haben. Aber selbst das habe ich berücksichtigt.

Habe meinen Code mal hochgeladen, weils mitlerweile schon ein paar Klassen sind (ist aber noch überschaubar)

Ich hoffe mir kann jemand helfen.


----------



## Carron (29. Mai 2010)

Hi,

ohne jetzt deinen weiteren Code angeschaut zu haben: gibt es einen Grund, warum deine Movie-Klasse von UnicastRemoteObject erbt?
Um via RMI als Daten-Container (als das interpretiere ich jetzt mal 'Movie') verschickt zu werden, muss lediglich das (von dir schon richtig eingesetzte) Serializable-Interface angenommen werden.

Das UnicastRemoteObject kommt nur bei der eigentlichen RMI-Schnittstelle ins Spiel, ist aber bei den übermittelten Daten obsolet (und vielleicht an dieser Stelle sogar hinderlich.

Kurzum: versuche das Ganze mal ohne das UnicastRemoteObject.

EDIT: Darüber hinaus kannst du bei einem Daten-Container auch auf das Remote-Interface verzichten und grundsätzlich brauchst du ein Interface (in deinem Beispiel Serializable) nicht mehrfach angeben. Wenn das MovieInterface schon Serializable ist, dann muss Movie nicht auch noch zusätzlich als Serializable erklärt werden 

Wenn ich morgen Abend mehr Zeit habe, teste ichs bei Bedarf nochmal genauer 


Viele Grüße
Carron


----------



## gorefest (1. Juni 2010)

Du darfst nicht auf Movie casten. Du bekommst einen remote-stub vom Typ proxy zurück, der ein MovieInterface implementiert.

Ergo : im Main das Objekt auf MovieInterface casten.

Grüße
gore


----------

