Java Сериализация ссылочных объектов - это "потеря значений"?

Добрый день,

У меня интересная проблема, которую я не могу понять. У меня есть класс с именем "HomeScreenManager", который поддерживает LinkedList, называемый chat. Экземпляр HomeScreenManager живет на сервере и отвечает за отслеживание соединений и журнала чата. Затем я создал класс с именем "ProtocolHomeScreen", который является классом с LinkedList, называемым chat, и реализует Serializable. Когда приходит время обновить всех клиентов с помощью чата, я хочу отправить ProtocolHomeScreen. Поэтому я создаю новый экземпляр ProtocolHomeScreen и говорю, что его связанный список строк "получает" связанный список HomeScreen. Другими словами, связанный список, который я хочу сериализовать, был создан в другом классе, но я указываю на него другим экземпляром. Проблема в том, что данные не отправляются, на другой стороне появляется только пустой LinkedList. Я построчно выполнил отладчик и проверил все переменные, и прямо перед вызовом writeObject все выглядит нормально, но затем на стороне клиента, когда я получаю экземпляр ProtocolHomeScreen, связанный список пуст! (это не ноль, хотя) Есть идеи? Спасибо!

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

        }

1 ответ

Решение

Вам нужно посмотреть на ObjectOutputStream.reset() и почему это существует. Любой данный объект отправляется только один раз за ObjectOutputStream если только ты не reset() поток или использование writeUnshared().

Другие вопросы по тегам