在java中使用ObjectOutputStream()时,对象必须是同一个吗?

时间:2016-01-23 02:13:57

标签: java sockets

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

我的项目结构如下:

Project structure

代码如下:

服务器:

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

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

3 个答案:

答案 0 :(得分:1)

根据您向我们展示的内容,我认为问题是服务器端的类路径上没有名为pers.yangxujie.RecordMangerServer.main.User的类。

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

答案 1 :(得分:0)

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

如果您确实知道您正在做什么,那么这些类可能会对其字段产生轻微的分歧,这取决于对象序列化规范的版本控制章节的规定:这可以作为一个方便的部署问题的解决方案,您无法同时更新服务器和客户端。

然而,从一开始就在同一系统中设置两个名为User的不同类是没有意义的。在这种情况下,强烈看起来它们在不同的包中,这使它们成为不同的类。这不适用于序列化目的。

答案 2 :(得分:-1)

服务器类是否在自己的单独文件中?确保它们中没有一个是内部类