繁体   English   中英

在Java中使用ObjectOutputStream()时,对象必须相同吗?

[英]Must the object be the same one when using ObjectOutputStream() in java?

我在服务器和客户端中定义了一个对象“ User”。 服务器端的“用户”只有一个构造函数,getter和setter,而客户端的“ User”有其他方法。

我的项目结构如下:

项目结构

代码如下:

服务器:

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) {

}
}

我想将User对象从客户端发送到服务器。 但是会抛出ClassNotFoundException。

java.lang.ClassNotFoundException: pers.yangxujie.RecordMangerServer.main.User

为什么? 我是否必须使用相同的“ User”对象?(但是我必须在两端都定义它们,因为它是c / s模型)

根据您显示的内容,我认为问题在于服务器端的类路径中没有名为pers.yangxujie.RecordMangerServer.main.User的类。

如果问题是由于客户端和服务器端的类版本不同而引起的,那么我希望看到不同的异常。 在序列化和反序列化时,使用不同版本的类通常是(IMO)的坏主意,因为差异可能会引起各种问题(如果您不小心的话)。 但是,有时这是不可避免的。

两端的类应相同 具有相同名称的不同类。 这里的“相同”表示相同的名称,相同的软件包,相同的serialVersionUID

如果您真的知道自己在做什么,则类可以对它们的字段有轻微的分歧,但要遵循对象序列化规范的“版本控制”一章的规定:这可以方便地解决无法解决的部署问题同时更新服务器和客户端。

但是,从一开始就在同一系统中拥有两个称为User的不同类是没有意义的。 在这种情况下,很可能它们位于不同的程序包中,这使它们成为不同的类。 这不适用于序列化目的。

服务器类是否在其自己的单独文件中? 确保他们都不是内部阶级

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM