9

我正在尝试使用 Java,并希望使用 Java 的客户端/服务器进行测试,以使客户端将自定义类(消息)的简单对象发送到服务器。问题是我一直在服务器端收到 ClassNotFoundException。

我认为其余的代码似乎没问题,因为其他对象(例如 String)可以毫无问题地通过。

我在客户端和服务器的不同位置有两个不同的 netbeans 项目。

他们每个人在各自的包下都有自己的 Message 类副本。Message 类实现 Serializable。

在客户端,我尝试通过发送 Message 对象。

在服务器端,在调用 readObject 方法时,它似乎是从客户端的包中找到 Message 类而不是它自己的。printStackTrace 在服务器端显示:“java.lang.ClassNotFoundException: client.Message”

我什至还没有尝试投射或存储收到的对象。有什么我遗漏的吗?

4

2 回答 2

21

两侧的包名和类名必须完全相同。即编写一次,编译一次,然后给双方相同的副本。没有单独的server.Messageclient.Message类,而是一个shared.Message类或类似的东西。

如果您可以保证相同的包/类名称,但并非总是完全相同的副本,那么您需要向serialVersionUID相关类添加具有相同值的字段。

package shared;

import java.io.Serializable;

public class Message implements Serializable {
    private static final long serialVersionUID = 1L;

    // ...
}
于 2010-05-26T19:33:56.667 回答
4

原因是,ObjectInputStream 中的 readObject() 实际上实现为:

 String s = readClassName();
 Class c = Class.forName(s); // Here your code breaks
 Object o = c.newInstance();
 ...populate o...
于 2010-05-26T20:14:29.523 回答