У меня есть класс bean на стороне клиента, который хранит пользовательские входные данные и отправляет их через сокет на сервер. Сервер имеет одинаковый класс bean.java.lang.ClassCastException при получении объекта с readObject()
сервер получает объект, но когда я пытаюсь присвоить то, что было получено на экземпляр класса компонента, это приводит к следующей ошибке:
java.lang.ClassCastException: ie.gmit.sw.client.methods.Client cannot be cast to ie.gmit.sw.server.methods.Client
класса с ошибкой:
public class DriveableImpl implements Driveable{
private Client client;
private ObjectOutputStream out;
private ObjectInputStream in;
public DriveableImpl() {
client = new Client();
}
// Method that receives connection socket and open in/out streams for current session
@Override
public void connect(Socket socket){
try {
out = new ObjectOutputStream(socket.getOutputStream());
in = new ObjectInputStream(socket.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public boolean login() throws Exception {
// Program crash here
client = (Client) in.readObject();
System.out.println(client.toString());
return false;
}
}
Я использую InvocationHandler для вызова методов, реализованных в классе выше:
public class MethodInvoker implements InvocationHandler{
private Object returnObject = null; // object that will hold any returns from invoked methods
private final Driveable userInterface;
protected MethodInvoker(Driveable ui) {
this.userInterface = ui;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws IllegalAccessException, IllegalArgumentException,
InvocationTargetException{
System.out.println("BEFORE");
returnObject = method.invoke(userInterface, args);
System.out.println(method.getName());
System.out.println("AFTER");
return returnObject; // could problem be possibly here?
}
}
Я действительно не уверен, что здесь происходит, поскольку он работает в простом дизайне приложения Client-Server. Я размещаю, на мой взгляд, части программы, имеющие отношение к ошибке, но я буду изменять пост, если возникнут какие-либо запросы.
Спасибо!
теперь, что происходит, я понимаю. Любые предложения по его устранению? Я попытался использовать закрытый статический окончательный длинный serialVersionUID = 777L; с обеих сторон для идентификации объектов. – GarRudo
Конечно, просто используйте один и тот же класс, как на клиенте, так и на сервере. В общем случае дублирование кода - это плохая практика. Поэтому вы должны просто повторно использовать существующий класс –
Что касается serialVersionUID - это не поможет. Если только может помочь, когда у вас разные версии одного и того же класса.И «тот же» в java означает: идентичный пакет и идентичное имя класса. –