readobject方法抛出ClassNotFoundException

时间:2010-05-26 19:29:02

标签: java client classnotfoundexception

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

我认为其余的代码似乎没问题,因为像String这样的其他对象可以毫无问题地通过。

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

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

在客户端,我尝试通过。

发送一个Message对象

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

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

2 个答案:

答案 0 :(得分:18)

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

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

package shared;

import java.io.Serializable;

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

    // ...
}

答案 1 :(得分:4)

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

 String s = readClassName();
 Class c = Class.forName(s); // Here your code breaks
 Object o = c.newInstance();
 ...populate o...