2012-05-19 1 views
2

Добрый день,Java Сериализация ссылочных объектов «потеряет значения»?

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

     } 
+0

Как выглядит ваш код для чтения/записи? Что * * проходит через другую сторону, а не данные, которые вы ожидаете? –

ответ

3

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

+1

А, спасибо большое! Я считаю, что это проблема ... Это имеет смысл. Ваш ответ привел меня на этот сайт http://www.javaspecialists.eu/archive/Issue088.html, который является другим руководством по использованию сброса. Спасибо за вашу помощь! – Matthew