1

私はプログラム (単純なチャット クライアント) を持っており、サーバーから更新されたクライアントを送信しようとしています。これを行うために、serializable キーワードを使用しています。既存のクライアントは、この種のオブジェクト送信からコードを読み込んで実行できるので、それで問題ありません。私の問題は、プログラムがいくつかの内部クラスを備えていることです。現在、私がこれを行っている方法は、更新に必要なすべてのクラス ファイルで構成される配列を作成し、それを反復処理して一度に 1 つずつ送信することです。私の問題は、それらが送信される順序が実行に影響を与えることです。内部クラスを最初に送信すると、コードは機能し、クライアントは更新されますが、内部クラスのいずれかが使用されるたびに「ClassDefNotFound」例外がスローされます。あるいは、内部クラスを最後に送信すると、コードがまったく機能しなくなり、

private static final Class[] clientUpdates = 
{EntryPanel.EnterSendListener.class, EntryPanel.ButtonSendListener.class,   
EntryPanel.class, MessagePanel.class, GUIClient.ClientThread.class, GUIClient.class,  
UpdateClientMessage.class};

パスを持つものはすべて内部クラスです。最後の要素は、送信時に新しいクライアントを開始するメソッドを実行する要素です。

for(Class c : clientUpdates)
            {
                String name = c.getName();
                InputStream is = c.getClassLoader().getResourceAsStream(
                        name.replaceAll("\\.", "/") + ".class");

                ByteArrayOutputStream os = new ByteArrayOutputStream();
                byte[] buff = new byte[1024];
                int i = is.read(buff);

                while(i != -1)
                    {
                        os.write(buff, 0, i);
                        i = is.read(buff);
                    }

                byte[] bs = os.toByteArray();

                NewMessageType m = new NewMessageType(name, bs);
                queue.put(m);
            }
            queue.put(new UpdateClientMessage("localhost", port));

クラス定義を送信するために使用しているコードです。NewMessageType は、クラスの未加工のバイト データを格納して送信し、反対側で読み取るように設計されたクラスです。ものをキューに入れると、単にそれらが送信されます。

私はネットワーキングが得意ではないことを最初に認めます。また、シリアライズ機能は私の得意分野ではありません。しかし、私はここでいくつかの助けを借りて本当にやることができました. それは大歓迎です。

4

1 に答える 1

0

ちなみにこれは直しました。問題は内部クラスではなく、循環依存関係(つまり、2つのクラスの両方が他方の定義を必要とする)に関係していました。これらを削除するために、依存関係の1つのクラスが参照し、もう1つのクラスが継承するいくつかの抽象クラスを追加しました。このように、最初に抽象的なものを送っていれば問題ありません。

于 2012-12-14T12:03:56.437 に答える