簡體   English   中英

套接字聊天應用程序-NotSerializableException

[英]Sockets Chat App- NotSerializableException

我正在建立具有服務器和多個客戶端的聊天應用程序。 當用戶連接到服務器時,服務器將調用notify_clients()並在線將客戶端列表發送給每個客戶端,以顯示在客戶端的“聯機列表”中。

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

但是,我得到NotSerializableException (在底部的輸出)。

當我在線搜索時,該解決方案經常為過程中使用的每個類和內部類實現Serializable 我繼續在程序中的每個類上implements Serializable ,但仍在下面所示的行中引發異常:

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();
            }
   }

ClientInfo類:

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;
        }
    }

我得到的錯誤:

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)

有人可以告訴我我需要做什么嗎?

您應該將transient修飾符添加到讀取器/寫入器

    public transient ObjectOutputStream writer;
    public transient ObjectInputStream reader;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM