-->

引用对象的Java序列是“失去价值”?(Java Serialization of referenc

2019-09-17 08:29发布

美好的一天,

我有一个有趣的问题,我无法理解。 我有一个名为“HomeScreenManager”类,它保持一个LinkedList <String>的称为聊天 。 该HomeScreenManager实例所在的服务器上,并负责跟踪的连接和聊天记录的。 然后,我创建一个名为“ProtocolHomeScreen”类,这是与一个LinkedList <字符串>称为聊天类并实现Serializable。 当谈到时间的聊天更新所有的客户,我想发出一个ProtocolHomeScreen。 所以,我创建了ProtocolHomeScreen的一个全新的实例,我说,这是链接字符串列表“得到”主屏幕的链接列表。 因此,换句话说,在不同的类中创建了我想要序列链表,但我指着它与另一个实例。 问题是,该数据不会发送,只有一个空的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);
        }

    }

}

编辑

这是在客户端代码......注意,玩家的链表遇到就好了,但我认为这事做的事实,我在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);
            }

        }

Answer 1:

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



文章来源: Java Serialization of referenced objects is “losing values”?