Java.lang.ClassCastException: $Proxy2 cannot be cast to

Ola pessoa, preciso de uma ajuda tenho um sistema que faz uma chamada em um metodo no servidor, esse metodo faz uma busca no banco de dados e retorn uma vetor do tipo “pergunta” porem quando chega no cliente estou recebendo o seguinte erro:

o codigo das classes estao logo depois do erro, nao consegui resolver isso, preciso muito de ajuda.

Resultado no terminal do Cliente:

comecando a conectar buscando uma pergunta ja passou da busca java.lang.ClassCastException: $Proxy2 cannot be cast to rmi.pergunta at Principal.inicio.<init>(inicio.java:72) at Principal.Game$25$1.run(Game.java:1348) at java.awt.event.InvocationEvent.dispatch(Unknown Source) at java.awt.EventQueue.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$000(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)

servidor

[code]package rmi;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class Server {

/**
 * @param args
 */
public static void main(String[] args) throws Exception {
	
	new Server();
}


public Server() {
	if(System.getSecurityManager() == null) {
		System.setSecurityManager(new SecurityManager());
		
	}
	
	Perguntas pergunta = null;
	vezInterface vez = null;
	
	try {
		pergunta = new daoPerguntas();
		vez=new vez();
		
	}catch (RemoteException e){
		e.printStackTrace();
	}
	
	try{
		java.rmi.registry.LocateRegistry.createRegistry(1099); 
		Naming.rebind("rmi://localhost:1099/vez", vez);
		Naming.rebind("rmi://localhost:1099/pergunta", pergunta);
		System.out.println("Aguardando...");
	}catch(RemoteException e){
		e.printStackTrace();
	}catch(MalformedURLException e){
		e.printStackTrace();
	}
}

}
[/code]

interface perguntas

[code]package rmi;

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.Vector;

public interface Perguntas extends Remote{

public Vector<pergunta> buscar(String tabela, int id, int dificuldade) throws RemoteException;

}
[/code]

class dao perguntas

[code]package rmi;

import java.io.Serializable;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

import javax.swing.JOptionPane;

import rmi.pergunta;
import banco.ConFactory;

public class daoPerguntas extends UnicastRemoteObject implements Perguntas, Serializable{

/**
 * 
 */
private static final long serialVersionUID = 1L;


public daoPerguntas() throws RemoteException {

}


private final String URL ="jdbc:mysql://localhost/algoquester",
	NOME = "root", SENHA = "";

private Connection con;
private Statement comando;


public void apagar(String tabela, int id){
	
	conectar();
	try {
		comando.executeUpdate("Delete FROM" + tabela + "WHERE id= '" +id+ "';");
	} catch (SQLException e) {
			imprimeErro("Erro ao apagar pergunta", e.getMessage());
	} finally {
		fechar();
	}
}

	
	
public Vector<pergunta> buscarTodos(String tabela) throws RemoteException {
	conectar();
	Vector<pergunta> resultados = new Vector<pergunta>();
	ResultSet rs;
	try {
		rs = comando.executeQuery("SELECT * FROM " + tabela);
		while (rs.next()) {
			pergunta temp = new pergunta();
			//pega todos os atributos da pergunta
			temp.setDificuldade(rs.getInt("dificuldade"));
			temp.setPergunta(rs.getString("pergunta"));
			temp.setRespA(rs.getString("respA"));
			temp.setRespB(rs.getString("respB"));
			temp.setRespC(rs.getString("respC"));
			temp.setRespD(rs.getString("respD"));
			temp.setRespE(rs.getString("respE"));
			String resposta = rs.getString("respCerta");
			char respCerta = resposta.charAt(0);
			temp.setRespCerta(respCerta);
			temp.setRespQuantidade(rs.getInt("respQuantidade"));
			resultados.add(temp);				
		}
		return resultados;
	}catch (SQLException e) {
		imprimeErro("Erro ao buscar pergunta", e.getMessage());
		return null;
	}
}

public Vector<pergunta> buscar(String tabela, int id ,int dificuldade) throws RemoteException {
	conectar();
	Vector<pergunta> resultados = new Vector<pergunta>();
	ResultSet rs;
	try {
		
		rs = comando.executeQuery("Select * FROM " +tabela+ " WHERE id='" +id+ "' and dificuldade ='" +dificuldade +"';");
		while (rs.next()) {
			pergunta temp = new pergunta();
			//pega todos os atributos da pergunta buscada
			temp.setPergunta(rs.getString("pergunta"));
			temp.setRespA(rs.getString("respA"));
			temp.setRespB(rs.getString("respB"));
			temp.setRespC(rs.getString("respC"));
			temp.setRespD(rs.getString("respD"));
			temp.setRespE(rs.getString("respE"));
			String resposta = rs.getString("respCerta");
			char respCerta = resposta.charAt(0);
			temp.setRespCerta(respCerta);
			temp.setRespQuantidade(rs.getInt("respQuantidade"));
			resultados.add(temp);
		}
		return resultados;
	} catch (SQLException e) {
		imprimeErro("Erro ao buscar pergunta", e.getMessage());
		return null;
	}
}


public void insere(String tabela, pergunta pergunta){
	conectar();
	try {
		comando.executeUpdate("INSERT INTO " +tabela+ "VALUES('" +pergunta.getDificuldade()+ "' , '" + pergunta.getPergunta()+
		"' , '" +pergunta.getRespA()+ "', '" +pergunta.getRespB()+"', '" +pergunta.getRespC()+ "','"+pergunta.getRespD()+"','" +
		pergunta.getRespE()+"','"+pergunta.getRespCerta()+"','" +pergunta.getRespQuantidade()+ "')");
	} catch (SQLException e) {
		imprimeErro("Erro ao inserir pergunta", e.getMessage());
	} finally {
		fechar();
	}
}

private void conectar(){
	try {
		con = ConFactory.conexao(URL, NOME, SENHA, ConFactory.MYSQL);
		comando = con.createStatement();
		System.out.println("Conectado!");
	} catch (ClassNotFoundException e) {
		imprimeErro("Erro ao carregar o driver", e.getMessage());
	} catch (SQLException e) {
		imprimeErro("Erro ao conectar", e.getMessage());
	}
}

private void fechar() {
	try {
		comando.close();
		con.close();
		System.out.println("Conexão Fechada");
	} catch (SQLException e) {
		imprimeErro("Erro ao fechar conexão", e.getMessage());
	}
}


private void imprimeErro(String msg, String msgErro) {
	JOptionPane.showMessageDialog(null,  msg, "Erro Critico", 0);
	System.err.println(msg);
	System.out.println(msgErro);
	System.exit(0);
}

}[/code]

classe perguntas

[code]package rmi;

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

public class pergunta extends UnicastRemoteObject implements Serializable{

public pergunta() throws RemoteException {
}
/**
 * 
 */
private static final long serialVersionUID = 1L;
private int dificuldade, respQuantidade;
private String pergunta, respA, respB, respC, respD, respE;
private char respCerta;
public int getDificuldade() {
	return dificuldade;
}
public void setDificuldade(int dificuldade) {
	this.dificuldade = dificuldade;
}
public String getPergunta() {
	return pergunta;
}
public void setPergunta(String pergunta) {
	this.pergunta = pergunta;
}
public String getRespA() {
	return respA;
}
public void setRespA(String respA) {
	this.respA = respA;
}
public String getRespB() {
	return respB;
}
public void setRespB(String respB) {
	this.respB = respB;
}
public String getRespC() {
	return respC;
}
public void setRespC(String respC) {
	this.respC = respC;
}
public String getRespD() {
	return respD;
}
public void setRespD(String respD) {
	this.respD = respD;
}
public String getRespE() {
	return respE;
}
public void setRespE(String respE) {
	this.respE = respE;
}
public char getRespCerta() {
	return respCerta;
}
public void setRespCerta(char respCerta) {
	this.respCerta = respCerta;
}
public int getRespQuantidade() {
	return respQuantidade;
}
public void setRespQuantidade(int respQuantidade) {
	this.respQuantidade = respQuantidade;
}

}
[/code]

no lado do cliente :

parte da classe que faz a chamada rmi e tenta mostrar o resultado;

[code]System.out.println(“comecando a conectar”);

	Perguntas busca =  (Perguntas) Naming.lookup("rmi://localhost:1099/pergunta");
	System.out.println("buscando uma pergunta");
	Vector<pergunta> resultado = busca.buscar(tabela, id, dificuldade);
	System.out.println("ja passou da busca");
	
	JButton btnFechar = new JButton("Fechar");
	btnFechar.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			
		}
	});

// Color bg = new Color(1f,1f,1f,0);

	JTextArea txtAreaResposta = new JTextArea();
	txtAreaResposta.setEditable(false);
	for (Iterator<pergunta> iterator = resultado.iterator(); iterator.hasNext();) {
	
	final pergunta perg = iterator.next();	
		
	//perguntasInterface perg = new pergunta();
	//perg = iterator.next();
	txtAreaResposta.setText(perg.getPergunta());[/code]

Dentro do projeto do cliente tem um pacote igual do servidor com a classe pergunta e a interface Perguntas.

agradeco desde de ja pela ajuda de quem puder.

Sua classe pergunta não deve extender UnicastRemoteObject. Pois ela é o Objeto que trafega na rede e não o serviço de conexão como a classe daoPergunta que implementa a inteface Pergutas extends Remote.

Dai como perguta tambem é UnicastRemoteObject ná hora de de-serializar a VM capota.

E daoPergunta não precisa implementar Serializable… você não vai trafegar ele pela rede, salvar-lo em banco ou afins. É só uma instância de servido de conexão.

aeee funcionou!!! Valeu pela ajuda!