在java中使用ObjectOutputStream()时,socket必须是同一个对象?
我在服务器端和客户端定义了一个对象“User”。服务器端的“用户”只有构造函数、getter和setter,而客户端的“用户”有其他方法
我的项目结构如下:
代码如下:
服务器:
class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private String password;
private String role;
User(String name, String password, String role) {
this.setName(name);
this.setPassword(password);
this.setRole(role);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
public String toString() {
return this.name + this.password + this.role;
}
}
客户:
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private String password;
private String role;
User(String name, String password, String role) {
this.name = name;
this.password = password;
this.role = role;
}
/*=====================getter and setter========================*/
public void set(String name, String password, String role) {
this.name = name;
this.password = password;
this.role = role;
}
public String get() {
return this.name + " " + this.password + " " + this.role;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return this.password;
}
public void setRole(String role) {
this.role = role;
}
public String getRole() {
return this.role;
}
/*==================Method===================*/
public void showMenu(String title) {
}
}
我想从客户端向服务器发送一个用户对象。但会引发ClassNotFoundException
java.lang.ClassNotFoundException: pers.yangxujie.RecordMangerServer.main.User
为什么??我必须使用相同的“用户”对象吗?(但我必须在两端定义它们,因为它是c/s模型)
# 1 楼答案
根据您向我们展示的内容,我认为问题在于服务器端的类路径上没有名为
pers.yangxujie.RecordMangerServer.main.User
的类如果问题是由于客户端和服务器端的类版本不同造成的,那么我希望看到不同的异常。在序列化和反序列化时,使用不同版本的类通常是个坏主意,因为这些差异可能会导致各种问题(如果您不小心的话)。然而,有时这是不可避免的
# 2 楼答案
该类的两端应相同。不是同名的不同类。这里的“same”表示相同的名称、相同的包、相同的
serialVersionUID
如果您真的知道自己在做什么,那么这些类可能会在它们的字段上有一些小的分歧,这取决于对象序列化规范的版本控制一章的规定:这可以方便地解决无法同时更新服务器和客户机的部署问题
然而,从一开始就在同一个系统中设置两个不同的类User是没有意义的。在本例中,它们明显位于不同的包中,这使得它们具有不同的类。这不适用于序列化目的
# 3 楼答案
服务器类是否在其自己的单独文件中?确保它们都不是内部类