Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中使用ObjectOutputStream()时,对象必须是相同的吗?_Java_Sockets - Fatal编程技术网

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

在java中使用ObjectOutputStream()时,对象必须是相同的吗?,java,sockets,Java,Sockets,我在服务器端和客户端定义了一个对象“User”。服务器端的“用户”只有构造函数、getter和setter,而客户端的“用户”有其他方法 我的项目结构如下: 代码如下: 服务器: class User implements Serializable { private static final long serialVersionUID = 1L; private String name; private String password; private String role; User

我在服务器端和客户端定义了一个对象“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

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

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


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

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


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

服务器类是否在其单独的文件中?确保它们都不是内部类

服务器类是否在其单独的文件中?确保它们都不是内部类

该类两端应相同。不是同名的不同类。这里的“same”表示相同的名称、相同的包、相同的
serialVersionUID

如果您真的知道自己在做什么,那么根据对象序列化规范版本控制一章的规定,这些类可能会在其字段方面有一些小的分歧:这对于解决无法同时更新服务器和客户端的部署问题非常方便

然而,从一开始就在同一个系统中设置两个不同的类User是没有意义的。在本例中,它们明显位于不同的包中,这使得它们具有不同的类。这不适用于序列化目的。

该类的两端应相同。不是同名的不同类。这里的“same”表示相同的名称、相同的包、相同的
serialVersionUID

如果您真的知道自己在做什么,那么根据对象序列化规范版本控制一章的规定,这些类可能会在其字段方面有一些小的分歧:这对于解决无法同时更新服务器和客户端的部署问题非常方便


然而,从一开始就在同一个系统中设置两个不同的类User是没有意义的。在本例中,它们明显位于不同的包中,这使得它们具有不同的类。这不适用于序列化目的。

您的
用户
类在两个应用程序中是否位于同一个包中?用户类的.class文件必须位于服务器的类路径上,以便它可以调用其无参数构造函数。请显示完整的堆栈跟踪,以便我们可以了解这里发生了什么。哦…我添加了项目结构。@lifeisamove您在上面声明它们都在同一个包中,但在我的回答下,您声明它们是不同的。如果上面的注释不正确,请将其删除。您的
用户
类在两个应用程序中是否位于同一个包中?用户类的.class文件必须位于服务器的类路径上,以便它可以调用其no args构造函数。请显示完整的堆栈跟踪,以便我们可以了解这里发生了什么。哦…我添加了项目结构。@lifeisamove您在上面声明它们都在同一个包中,但在我的回答下,您声明它们是不同的。如果上面的评论不正确,请将其删除。是的,它们位于不同的软件包中。你的意思是“用户”类必须在同一个包中吗?你会说,“从一开始就在同一个系统中设置两个不同的类称为User是没有意义的”。但是如何在客户机和服务器(在两台机器上)中使用相同的用户类呢?在同一个包中。时期相应地组织您的项目。您可能需要构建包含所有共享类的第三个项目,我的项目的结构似乎有一些问题。我必须重新思考它,然后重构它。非常感谢:)是的,它们有不同的包装。你的意思是“用户”类必须在同一个包中吗?你会说,“从一开始就在同一个系统中设置两个不同的类称为User是没有意义的”。但是如何在客户机和服务器(在两台机器上)中使用相同的用户类呢?在同一个包中。时期相应地组织您的项目。您可能需要构建包含所有共享类的第三个项目,我的项目的结构似乎有一些问题。我必须重新思考它,然后重构它。非常感谢:)