0

これが私の質問です。

クライアントとサーバーの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クラスがクライアント上の別のクラスであると考えているようです。

これを修正する方法はありますか(クライアントとサーバーの両方で同じパッケージ名を使用する以外に)?

4

1 に答える 1

2

データトランスポートオブジェクトクラスは同じクラスである必要があります。つまり、同じ内容だけでなく、同じ完全修飾クラス名(つまり、同じパッケージ名と同じクラス名)を持っている必要があります。

シリアル化プロセスによって発行されるバイトストリームには、オブジェクトの完全修飾クラス名(およびスーパークラスのFQCN)が含まれます。次に、非一時的、非静的フィールドのシリアル化されたバージョンも含まれます(フックメソッドの1つを使用してシリアル化プロセスをカスタマイズした場合を除く)。

これがバイトストリームの例です。この例では、クラスがデフォルトの(空の)パッケージに含まれているため、説明している内容が少しわかりにくくなっていることに注意してください。

于 2012-06-04T23:40:32.350 に答える