java .lang.ClassCastException: java .io.ObjectStreamClass не может быть приведен к [MyClass] - PullRequest
0 голосов
/ 02 марта 2020

В настоящее время я реализую функцию поиска, при которой введенная пользователем строка отправляется на сервер, который просматривает базу данных и отправляет всех пользователей, имя пользователя которых соответствует данной строке, обратно клиенту. Для передачи я использую пользовательский класс Message, который содержит строку, содержащую действие, которое должно быть выполнено (здесь не имеет значения), и объект, который является фактическим сообщением. В этом случае это будет ArrayList<User>. Я использую метод writeObject() из ObjectOutputStream и readObject() из ObjectInputStream для передачи данных. После получения данных я приведу объект к объекту сообщения, и именно здесь я получаю исключение. Примечание: приведение к Message прекрасно работает в любой другой точке кода, но здесь выдается исключение.

Исключение:

Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: java.io.ObjectStreamClass cannot be cast to gruber.common.Message
    at gruber.client.controller.ChatRoomController.lambda$searchForUser$2(ChatRoomController.java:105)
    at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
    at java.lang.Thread.run(Thread.java:748)

Сторона клиента:

 private void searchForUser(){
        try {
                oos.writeObject(new Message("SEARCH", searchfield.getText()));
                oos.flush();

                Message results = (Message)ois.readObject();

                ArrayList<User> users = (ArrayList<User>)results.getMsg();
                for(User u: users) {
                    System.out.println(u.getUsername());
                }
            } catch (IOException | ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }

Серверная часть:


 private void search() throws SQLException, IOException {
    Message client_msg = (Message) client.getOis().readObject();
    String searchParam = client_msg.getMsg();
        PreparedStatement searchUsers = con.prepareStatement("SELECT username, image from chatuser where username like ?");
        searchUsers.setString(1, searchParam);
        ResultSet results = searchUsers.executeQuery();
        ArrayList<User> users = new ArrayList<>();

        while (results.next()) {
            users.add(new User(results.getString(1), results.getBytes(2)));
        }

        client.getOos().writeObject(new Message("SEARCH", users));
        client.getOos().flush();
    }

Класс сообщения (при необходимости):

package gruber.common;

import java.io.Serializable;

public class Message implements Serializable {
    private String action;
    private Object msg;

    public Message(String action, Object msg) {
        this.action = action;
        this.msg = msg;
    }

    public String getAction() {
        return action;
    }

    public void setAction(String action) {
        this.action = action;
    }

    public Object getMsg() {
        return msg;
    }

    public void setMsg(Object msg) {
        this.msg = msg;
    }
}

1 Ответ

0 голосов
/ 02 марта 2020

Если класс реализует сериализуемый, он должен определить атрибут serialVersionUID со значением, которое вы можете свободно определять.

private static final long serialVersionUID = 1L;

Если вы не определите serialVersionUID, он будет сгенерирован java и может отличаться на разных JVM, вследствие чего объект не может быть заменен между этими JVM.

Поскольку вы Говоря о клиенте и сервере, я предполагаю, что JVM могут быть разными на клиенте и сервере. Ваш класс Message реализует Serializable, но не определен serialVersionUID. Попробуйте добавить этот атрибут. То же самое относится и к вашему пользовательскому объекту.

...