我正在尝试使用Java并希望使用Java的客户端/服务器进行测试,以使客户端将自定义类(Message)的简单对象发送到服务器。问题是我一直在服务器端获得ClassNotFoundException。
我认为其余的代码似乎没问题,因为像String这样的其他对象可以毫无问题地通过。
我在客户端和服务器的不同位置有两个不同的netbeans项目。
他们每个人在各自的包装下都有自己的Message类副本。 Message类实现Serializable。
在客户端,我尝试通过。
发送一个Message对象在服务器端,在调用readObject方法时,它似乎是从客户端的包而不是它自己的包中找到Message类。 printStackTrace显示:服务器端的“java.lang.ClassNotFoundException:client.Message”
我甚至没有尝试过投射或存储收到的对象。我遗漏了什么吗?
答案 0 :(得分:18)
包名和类名在两侧必须完全相同。即写一次,编译一次,然后给双方相同的副本。没有单独的server.Message
和client.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...