Java 通过ObjectStream序列化问题发送/接收

Java 通过ObjectStream序列化问题发送/接收,java,object,serialization,stream,Java,Object,Serialization,Stream,这就是我的问题 我有一个客户端和一个服务器java程序。 每一个都与另一个建立并管理ObjectInputStream/ObjectOutputStream 我希望能够发送对象(给定所有发送的对象将扩展我创建的数据包类)。 问题是,即使客户机和服务器可能具有与数据包类完全相同的代码,我也会收到一个错误: java.lang.ClassNotFoundException: shared.Packet0Connect at java.net.URLClassLoader$1.run(Unkn

这就是我的问题

我有一个客户端和一个服务器java程序。 每一个都与另一个建立并管理ObjectInputStream/ObjectOutputStream

我希望能够发送对象(给定所有发送的对象将扩展我创建的数据包类)。 问题是,即使客户机和服务器可能具有与数据包类完全相同的代码,我也会收到一个错误:

java.lang.ClassNotFoundException: shared.Packet0Connect
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at java.io.ObjectInputStream.resolveClass(Unknown Source)
    at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
    at java.io.ObjectInputStream.readClassDesc(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at com.mooman219.gmail.server.ReceivePacketThread.run(ReceivePacketThread.java:19)
似乎java认为服务器上的包类与客户端上的包类不同


有什么方法可以解决这个问题(除了在客户端和服务器上具有相同的包名之外)?

数据传输对象类必须是相同的类--它们必须具有相同的完全限定类名(即相同的包名和相同的类名),而不仅仅是相同的内容

序列化过程发出的字节流包括对象的完全限定类名(以及超类的FQCN)。然后,它还包括非瞬态、非静态字段的序列化版本(除非您使用钩子方法之一自定义了序列化过程)


这是一个例子。请注意,在示例中,该类位于默认(空)包中,这使得我们讨论的内容的说明不太清楚。

@Joe:为什么不能使用完全相同的类?你为什么要在两端复制它?这是违反规定的。我想在两端都有一个完全相同的类,只是在不同的包中。@Joe:但是它不是同一个类。为什么要将其放在不同的包中?如果使用相同的包名比使用相同的包名更好,我只是希望有一种方法可以使用不同的名称。出于组织原因,我最初将它们放在不同的包中。我想我只是好奇:D