java.lang.ClassCastException : java. io.ObjectStreamClass 无法转换为 [MyClass]

标签 java client-server classcastexception objectinputstream objectoutputstream

我目前正在实现一个搜索功能,其中用户输入的字符串被发送到服务器,该服务器查看数据库并将用户名与给定字符串匹配的所有用户发送回客户端。对于传输,我使用自定义类 Message其中包含一个字符串,其中包含要执行的操作(此处不相关)和一个作为实际消息的对象。在这种情况下,这将是 ArrayList<User> 。我用writeObject()方法来自ObjectOutputStreamreadObject()来自ObjectInputStream传输数据。收到数据后,我将对象转换为消息对象,这就是我收到异常的地方。注意:转换为 Message 在代码中的任何其他点都可以正常工作,但在这里它会抛出异常。

异常(exception):

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;
    }
}

最佳答案

如果一个类实现了可序列化,它应该定义一个属性serialVersionUID,其值可以自由定义。

private static final long serialVersionUID = 1L;

如果您没有定义serialVersionUID,它将由java生成,并且在不同的JVM上可能会有所不同,从而导致对象无法在这些JVM之间互换。

既然你谈论的是客户端和服务器,我假设客户端和服务器上的 JVM 可能不同。 您的 Message 类实现了 Serialized 但没有定义serialVersionUID。尝试添加这个属性。这对于您的用户对象同样有效。

关于java.lang.ClassCastException : java. io.ObjectStreamClass 无法转换为 [MyClass],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60489032/

相关文章:

java - 如果我在 Spring 中运行 Hibernate 请求,为什么会收到 ClassCastException?

java - 只构建jar,然后删除所有文件夹

android - java.lang.ClassCastException : java. util.HashMap 无法转换为 java.util.TreeMap

java - 使用 java Rally Rest API 更新 Rally 中的测试集

c - 使用 scanf 时无限循环

Java RMI - 使客户端成为服务器

java - 创建自定义异常并从服务器抛出它

java - 在 WebSphere 6.1 上使用 ant/jenkins 生成 EAR 的类转换异常

java - 使用 Wss4jSecurityInterceptor 抛出 WRONG_DOCUMENT_ERR : A node is used in a different document than the one that created it

java - 在 java 中维护 TCP 套接字有多昂贵