【问题标题】:Sending / Receiving through a ObjectStream serialization issue通过 ObjectStream 序列化问题发送/接收
【发布时间】:2012-06-09 00:39:12
【问题描述】:

所以这是我的问题。

我有一个客户端和一个服务器 java 程序。 各自建立和管理一个ObjectInputStream/ObjectOutputStream。

我希望能够发送对象(鉴于发送的所有对象都将扩展我创建的 Packet 类)。 问题是,即使客户端和服务器可能具有完全相同的数据包类代码,我也会收到错误消息:

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认为服务端的Packet类是客户端的不同类。

有没有办法解决这个问题(除了在客户端和服务器上使用相同的包名称)?

【问题讨论】:

    标签: java object serialization stream


    【解决方案1】:

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

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

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

    【讨论】:

    • @Joe:你为什么不能使用完全相同的类?你为什么要在两端复制它?这违反了DRY
    • 我希望两端都有完全相同的类,只是在不同的包中。
    • @Joe:但那不是同一个班级。为什么要放在不同的包里?
    • 如果使用相同的包名比我走那条路更好,我只是希望有一种方法可以使用不同的名称。
    • 我最初出于组织原因将它们放在不同的包中。我想我只是好奇:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 2011-09-12
    相关资源
    最近更新 更多