引用对象的Java序列化是“失去价值”?

美好的一天,

我有一个我无法理解的有趣问题。 我有一个名为“HomeScreenManager”的类,它维护一个名为chatLinkedList 。 HomeScreenManager实例位于服务器上,负责跟踪连接和聊天记录。 然后我创建了一个名为“ProtocolHomeScreen”的类,它是一个带有LinkedList 的类,称为chat,并实现Serializable。 当需要通过聊天更新所有客户端时,我想发送一个ProtocolHomeScreen。 所以我创建了一个全新的ProtocolHomeScreen实例,我说它是链接的字符串列表“获取”HomeScreen的链表。 换句话说,我要序列化的链表是在另一个类中创建的,但我指的是另一个实例。 问题是数据没有被发送,只有一个空的LinkedList出现在另一边。 我已经逐行完成了调试器并检查了所有变量,在我调用writeObject之前,一切看起来都很好,但是在客户端,当我收到ProtocolHomeScreen实例时,链表是空的! (虽然它不是空的)任何想法? 谢谢!

public class HomeScreenManager implements ObjectMessageHandler, Serializable { protected LinkedList users; protected LinkedList chat; protected LinkedList sessions; public HomeScreenManager() { chat = new LinkedList(); users = new LinkedList(); sessions = new LinkedList(); } 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 chat; public LinkedList players; public LinkedList sessions; public ProtocolHomeScreen(HomeScreenManager hms) { players = new LinkedList(); for(User u:hms.getUsers()) { players.add(u.getUsername()); } sessions = hms.getSessions(); chat = hms.getChat(); chat = new LinkedList(); 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); } } 

您需要查看ObjectOutputStream.reset()及其存在的原因。 除非您reset()流或使用writeUnshared().否则任何给定对象仅通过ObjectOutputStream发送一次writeUnshared().