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

Добрый день,

У меня интересная проблема, которую я не могу понять. У меня есть класс HomeScreenManager, который поддерживает LinkedList‹String›, называемый chat. Экземпляр HomeScreenManager живет на сервере и отвечает за отслеживание подключений и журнал чата. Затем я создал класс под названием «ProtocolHomeScreen», который представляет собой класс с LinkedList‹String›, называемый 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);
            }

        }

person Matthew    schedule 19.05.2012    source источник
comment
Как выглядит ваш код чтения/записи? Что проходит с другой стороны вместо данных, которые вы ожидаете?   -  person Neil Coffey    schedule 19.05.2012


Ответы (1)


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

person user207421    schedule 20.05.2012
comment
Ах, большое спасибо! Я считаю, что проблема в этом... В этом есть смысл. Ваш ответ привел меня на этот веб-сайт javaspecialists.eu/archive/Issue088.html, который еще один учебник о том, когда использовать сброс. Спасибо за вашу помощь! - person Matthew; 21.05.2012