Добрый день,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);
}
}
Как выглядит ваш код для чтения/записи? Что * * проходит через другую сторону, а не данные, которые вы ожидаете? –