【问题标题】:Java Serialization of referenced objects is "losing values"?引用对象的Java序列化是“丢失值”吗?
【发布时间】:2012-05-19 13:57:28
【问题描述】:

早安,

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

        }

【问题讨论】:

  • 你的读/写代码是什么样的?另一端是什么,而不是您期望的数据?

标签: java serialization object-graph


【解决方案1】:

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

【讨论】:

  • 啊,非常感谢!我相信这就是问题所在……这完全有道理。您的回复将我带到了这个网站javaspecialists.eu/archive/Issue088.html,这是另一个关于何时使用重置的教程。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
相关资源
最近更新 更多