序列化代理

时间:2015-01-28 00:53:29

标签: java serialization

我读过我们应该只序列化对象的逻辑部分。

  

当对象的物理时使用默认的序列化形式   表示与其逻辑数据内容有很大不同   四个缺点:

     

... //它们与默认序列化形式有关,与之无关   主题

     

//关于字符串的链接列表:

     

合理的序列化表格   对于StringList,只是列表中的字符串数,紧随其后   由字符串本身。这构成了逻辑数据   由StringList表示,剥去了它的物理细节   表示。

     

Effective Java(第2版),第75项

在链表的情况下,它意味着我们不应该序列化任何实现细节,如节点关系,但实际上只是“元素列表”。

我有链表实现,并希望在其中实现序列化代理模式 Effective Java(第2版),第78项),但也不违反规则以上。还有一句话:

  

序列化代理模式相当简单。首先,设计一个可序列化类的私有静态嵌套类   简洁地表示实例的逻辑状态   附上课。这个嵌套类,称为序列化代理,   应该有一个构造函数,其参数类型是   附上课。此构造函数仅复制其数据   论证:它不需要做任何一致性检查或防御   复制。按照设计,序列化的默认序列化形式   代理是封闭类的完美序列化形式

所以在序列化代理类中序列化对象的逻辑状态是正确的(正如我在下面所做的那样)或者例如列表的头节点的序列化也是正确的实现细节也是正确的吗?

注意:List接口和LinkedList类是我自己的实现,而不是java.util

//...
private static class SerializationProxy<E> implements Serializable {
        private final E[] elements;

        SerializationProxy(List<? extends E> list) {
            elements = list.toArray(Object.class); //returns array with all elements
        }

        private Object readResolve() {
            return new LinkedList<E>(elements); //constructor that take array and wraps it back in LinkedList
        }

        private static final long serialVersionUID = 123131234141423234L;
    }


    private void readObject(ObjectInputStream stream)
        throws InvalidObjectException {
    throw new InvalidObjectException("Proxy required");
    }

    private Object writeReplace() {
        return new SerializationProxy<E>(this); //pass enclosing class for proxy serializtion
    }
//...

如果某些内容不明确,请full implementation. 提前致谢。

1 个答案:

答案 0 :(得分:1)

  

是否只能在序列化代理类中序列化对象的逻辑状态(如下所示)

那是你的引言所说的。

  

或者例如列表的头节点的序列化也是正确的实现细节?

这正是你的报价所警告的。

不一定我同意引文。例如,我没有原则上反对序列化链接。可能存在实际异议,例如递归深度,但这是另一回事。

很难理解为什么你必须发布这个问题,当你已经有一个受人尊敬的引用,并且你已经实现了答案,这反过来表明你已经理解了你所读到的内容。 / p>