java序列化自定义链表

时间:2016-04-29 15:15:33

标签: java serialization

我不想使用提供的LinkedList类,所以我编写了一个自定义链表。问题是我担心使用默认的读/写对象函数序列化此对象时可能发生的堆栈溢出问题

我从另一篇SO帖子中看到,你必须使用如下的自定义序列化:

MyClass{

    transient Node header; 

    private void writeObject(ObjectOutputStream out) throws IOException {
        out.defaultWriteObject();
        for (Entry e = header.next; e != header; e = e.next)
        out.writeObject(e.element);
    }
    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        in.defaultReadObject();
    }



}

这是节点类

Node{
    transient Node next;
    transient Node prev;
    private void writeObject(ObjectOutputStream out) throws IOException {
        out.defaultWriteObject();
        for (Entry e = header.next; e != header; e = e.next)
        out.writeObject(e.element);
    }
    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        in.defaultReadObject();
    }

}

我怎么想知道,因为我把标题字段设置为瞬态,当我读取该类时它不会为空?如何让它引用标题节点...

节点相同,因为当我读取对象时,next和prev字段是瞬态的,字段将为null,如何使它们保持对彼此的引用

1 个答案:

答案 0 :(得分:1)

是的,你是对的,他们将是空的。

您必须以与实现写入对象类似的方式实现readObject:

while(elementsToRead()); // you need to know somehow how long you need to read
{
    add(inputStream.readObject());
}

我建议在Java库中查看列表的读写对象的实现。

为什么你不能使用Java链表?如果缺少某些内容,您是否考虑过扩展linkedLlist?

您基本上可以查看Linked List源代码并查看序列化的执行方式。