【问题标题】:readobject method throws ClassNotFoundExceptionreadobject 方法抛出 ClassNotFoundException
【发布时间】:2010-05-26 19:29:02
【问题描述】:

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

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

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

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

在客户端,我尝试发送一个 Message 对象。

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

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

【问题讨论】:

    标签: java client classnotfoundexception


    【解决方案1】:

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

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

    package shared;
    
    import java.io.Serializable;
    
    public class Message implements Serializable {
        private static final long serialVersionUID = 1L;
    
        // ...
    }
    

    【讨论】:

    • 请不要让serialUID正好是1L,因为这可能会干扰其他有同样想法的愚蠢开发者。
    • 现在可以使用了!谢谢~!!终于明白怎么回事了
    • @BalusC- 这太酷了。好几天我都为此头疼。
    • 像 churm 一样工作,7 年后 - “没有单独的 server.Message 和 client.Message 类,而是一个 shared.Message 类或类似的东西。如果你能保证相同的包/类名,但并不总是完全相同的副本,”
    【解决方案2】:

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

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

    【讨论】:

    • 问题是为什么?
    猜你喜欢
    • 2012-07-29
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 2016-07-15
    • 2013-05-27
    • 2017-05-30
    • 1970-01-01
    相关资源
    最近更新 更多