2

良い一日、

理解できない興味深い問題があります。Chatと呼ばれるLinkedList<String>を維持する「HomeScreenManager」というクラスがあります。HomeScreenManager インスタンスはサーバー上に存在し、接続とチャット ログの追跡を担当します。次に、チャットと呼ばれるLinkedList<String>を持つクラスである「ProtocolHomeScreen」というクラスを作成しましたSerializable を実装します。チャットですべてのクライアントを更新するときが来たら、ProtocolHomeScreen を送信したいと考えています。そこで、ProtocolHomeScreen の新しいインスタンスを作成します。これは文字列のリンク リストであり、HomeScreen のリンク リストを「取得」します。つまり、シリアライズしたいリンクリストは別のクラスで作成されましたが、別のインスタンスでそれを指しています。問題は、データが送信されず、反対側に空の LinkedList のみが表示されることです。デバッガーを 1 行ずつ実行し、すべての変数を検査し、writeObject を呼び出す直前にすべて問題ないように見えますが、クライアント側で ProtocolHomeScreen インスタンスを受け取ると、リンクされたリストが空です! (ただしnullではありません)何かアイデアはありますか?ありがとうございました!

public class HomeScreenManager implements ObjectMessageHandler, Serializable
{
protected LinkedList<User> users;
protected LinkedList<String> chat;
protected LinkedList<String> sessions;

public HomeScreenManager()
{
    chat = new LinkedList<String>();
    users = new LinkedList<User>();
    sessions = new LinkedList<String>();
}
protected void handleChat(String message)
{
    chat.add(message);

    ProtocolHomeScreen p = new ProtocolHomeScreen(this);

    for(User u:users)
    {
        u.connection.WriteObject(p); //At this point in time, p has the correct data, but when I deserialize p, the chat list is empty...
    }
}

次に、ここにプロトコルクラスがあります...

public class ProtocolHomeScreen implements Serializable
{
    public LinkedList<String> chat;
    public LinkedList<String> players;
    public LinkedList<String> sessions;


    public ProtocolHomeScreen(HomeScreenManager hms)
    {
        players = new LinkedList<String>();
        for(User u:hms.getUsers())
        {
            players.add(u.getUsername());
        }
        sessions = hms.getSessions();
        chat = hms.getChat();

        chat = new LinkedList<String>();

        for(String s: hms.getChat())
        {
            chat.add(s);
        }

    }

}

編集

これはクライアント側のコードです... プレーヤーの LinkedList は問題なく表示されることに注意してください。ただし、ProtocolHomeScreen (サーバー側) のコンストラクターで新しいインスタンスを作成したという事実と関係があると思います。

else if(obj instanceof ProtocolHomeScreen)
        {       
            ProtocolHomeScreen phs = (ProtocolHomeScreen) obj;

            sessionModel.removeAllElements();
            playersModel.removeAllElements();
            chatOutput.setText("");
            for(String s:phs.players)
                playersModel.addElement(s);

            for(String s:phs.sessions)
                sessionModel.addElement(s); 

            for(String s:phs.chat)
            {
                chatOutput.setText(chatOutput.getText()+s);
            }

        }
4

1 に答える 1

4

ObjectOutputStream.reset()なぜそれが存在するのかを調べる必要があります。特定のオブジェクトは、ストリームまたは使用しObjectOutputStreamない限り、一度だけ送信されますreset()writeUnshared().

于 2012-05-20T02:27:03.880 に答える