2017-01-12 4 views
0

У меня есть класс 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. Я размещаю, на мой взгляд, части программы, имеющие отношение к ошибке, но я буду изменять пост, если возникнут какие-либо запросы.

Спасибо!

ответ

1

Примечание сериализации Ошибка:

В нем четко говорится, что у вас есть 2 разных классов (возможно, они выглядят точно так же), но они находятся в разных пакетах:

ie.gmit.sw.**client**.methods 
ie.gmit.sw.**server**.methods 

Это означает, что из точка зрения Явы они совершенно не связаны

ie.gmit.sw.client.methods.Client cannot be cast to ie.gmit.sw.server.methods.Client 

Это причина того, почему у вас есть исключение и класс литых

В java тот же класс означает, что он находится в одном пакете и имеет одно и то же имя. Итак, у вас должен быть один и тот же класс на сервере и на клиенте. Есть два способа для достижения этой цели:

  • Просто поставить тот же самый класс дважды - один раз в клиенте и один раз в сервере. В вашем случае это означает - переименовать пакет как нечто общее. Это плохой подход из-за дублирования кода

  • Поместите объекты, которые передадут сериализацию в третий «общий» модуль (из него будет выведена банка), а когда вы запустите клиент и сервер, заставьте их зависеть от этот модуль. Так что физически у вас будет только одна копия класса «Клиент».

Надеется, что это помогает

+0

теперь, что происходит, я понимаю. Любые предложения по его устранению? Я попытался использовать закрытый статический окончательный длинный serialVersionUID = 777L; с обеих сторон для идентификации объектов. – GarRudo

+1

Конечно, просто используйте один и тот же класс, как на клиенте, так и на сервере. В общем случае дублирование кода - это плохая практика. Поэтому вы должны просто повторно использовать существующий класс –

+0

Что касается serialVersionUID - это не поможет. Если только может помочь, когда у вас разные версии одного и того же класса.И «тот же» в java означает: идентичный пакет и идентичное имя класса. –

Смежные вопросы