2016-04-05 2 views
0

私はサーバーと複数のクライアントとチャットアプリケーションを構築しています。ユーザーがサーバーに接続すると、サーバーはnotify_clients()を呼び出し、クライアントのリストを各クライアントにオンラインで送信し、クライアントの「オンラインリスト」に表示します。ソケットチャットApp- NotSerializableException

server.notify_clients(new MessageInfo(server_back_end.server_front_end.clients)); 

ただし、私はNotSerializableException(下段に出力)を取得しています。

オンラインで検索したところ、このソリューションでは、プロセスで使用されるすべてのクラスと内部クラスに対してSerializableを頻繁に実装していました。 ClientInfoクラス

public void notify_clients(MessageInfo message_info) 
    { 
      try 
      { 
       for (int i = 0; i < client_list.getSize(); i++) 
       { 
       ClientInfo client = getElementAt(i); 
       ObjectOutputStream writer = client_list.indexOf(client).writer; 
       writer.writeObject(message_info); //Exception thrown here 
       writer.flush(); //doesnt reach here 
       } 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
    } 

public class ClientInfo implements Serializable 
{ 
    public ObjectOutputStream writer; 
    public ObjectInputStream reader; 
    public String user_name; 


    /*Constructor*/ 
    public ClientInfo(ObjectOutputStream writer, ObjectInputStream reader, String user_name) 
    { 
     this.reader = reader; 
     this.writer = writer; 
     this.user_name = user_name; 
    } 


    public ClientInfo(ObjectOutputStream writer, ObjectInputStream reader) 
    { 
     this.reader = reader; 
     this.writer = writer; 
     try 
     { 
      this.user_name = (String) this.reader.readObject(); 
     } 
     catch (IOException | ClassNotFoundException ignored) 
     { 
     } 
    } 


    @Override 
    public String toString() 
    { 
     return this.user_name; 
    } 
}//end class 

MessageInfoクラス:

public class MessageInfo implements Serializable 
    { 
     public List<ClientInfo> clients; 
     public List<ClientInfo> recipients; 
     public String message_contents; 


     public MessageInfo(List<ClientInfo> clients) 
     { 
      this.clients = clients; 
     } 
    } 
を私は先に行って、 implements Serializableすべてのクラスに私のプログラムでは、それはまだラインでの例外は、以下に示すスロー

エラー:

java.io.NotSerializableException: java.io.ObjectInputStream 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348) 
    at java.util.ArrayList.writeObject(ArrayList.java:762) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348) 
    at ServerBackEnd.broadcast(ServerBackEnd.java:110) 
    at ConnectionThread.add_incoming_clients(ServerBackEnd.java:211) 
    at ConnectionThread.run(ServerBackEnd.java:184) 

誰かが私に何をする必要があるか教えてもらえますか?

+0

transient修飾子を追加する必要があります。 ObjectOutputStreamをシリアル化できますか(わかりませんが、そうは思わない) – KevinO

+0

'ObjectInputStream'と' ObjectOutputStream'は 'Serializable'ではありません。したがって、トランジェント3kingsを使用するには – 3kings

+0

を使用しますか?編集:投稿された答えを見た – user3487243

答えて

1

あなたはすべてのインスタンス変数をシリアル化できることを確認する必要があり、リーダ/ライタ

public transient ObjectOutputStream writer; 
    public transient ObjectInputStream reader; 
+0

ありがとう、私はそれを試してみます – user3487243

+0

それは働いた!それ以上の例外はありません!私はそれが何をしているかを見るために一時的に読まなければなりません。ありがとうございました !! – user3487243

関連する問題