链表和指针到列表的冗余序列化

时间:2016-06-07 22:19:44

标签: java pointers serialization

我有一个人为的问题。

我们说我有一个用户链接列表,其中一个用户是"本周用户":

public class UserOfTheWeek implements Serializable {
    private UserNode root;
    private UserNode userOfTheWeek;

    //...

    private class UserNode {
        String username;
        UserNode next;
    }

    public void saveToFile() {
        ObjectOutputStream oos = new ...
        oos.writeObject(root);
        oos.writeObject(userOfTheWeek);
    }
}

root显然存储了对列表头部的引用,userOfTheWeek可以指向任何节点。我想保存链表,但会保存userOfTheWeek制作列表的一部分副本吗?如果列表头部的用户恰好是本周的用户,则可以将整个列表保存两次,更糟糕的是,userOfTheWeek不会指向root所指向的列表中的对象{1}}。

有谁知道会发生什么?如果没有,我也愿意接受另一种解决方案。

1 个答案:

答案 0 :(得分:1)

  

我想保存链表,但会保存userOfTheWeek制作列表的一部分副本吗?

没有

  

如果列表头部的用户恰好是本周的用户,则可以将整个列表保存两次

没有

流知道哪些对象已经序列化到它,并且不会重新序列化它们。请参阅Object Serialization Specification #1.2。同样,该对象仅被反序列化一次。对象图可以完全通用地序列化和恢复,包括循环。

  

更糟糕的是,userOfTheWeek不会指向root指向的列表中的对象。

您必须单独序列化和反序列化,但不会导致创建新对象,它将引用列表中的对象。