gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:09:44 28 4
gpt4 key购买 nike

我目前正在实现一个搜索功能,其中用户输入的字符串被发送到服务器,该服务器查看数据库并将用户名与给定字符串匹配的所有用户发送回客户端。对于传输,我使用自定义类 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com