gpt4 book ai didi

引用对象的 Java 序列化是 "losing values"吗?

转载 作者:行者123 更新时间:2023-12-04 18:21:09 25 4
gpt4 key购买 nike

再会,

我有一个我无法理解的有趣问题。我有一个名为“HomeScreenManager”的类,它维护一个 链表 叫聊天。 HomeScreenManager 实例位于服务器上,负责跟踪连接和聊天日志。然后我创建了一个名为“ProtocolHomeScreen”的类,它是一个具有 的类。链表 称为聊天并实现可序列化。当需要通过聊天更新所有客户端时,我想发送一个 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...
}
}

然后这里是协议(protocol)类...
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);
}

}

最佳答案

你需要看看ObjectOutputStream.reset()以及它为什么存在。任何给定对象仅通过 ObjectOutputStream 发送一次除非你 reset()流或使用writeUnshared().

关于引用对象的 Java 序列化是 "losing values"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10665786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com