了解序列化代理

时间:2015-12-14 08:57:09

标签: java serialization proxy

我正在阅读J.Bloch的Effective Java,现在我正在阅读有关使用序列化代理的部分。问题不在于整个过程的优势。我试图了解它的一个特殊优势。这是优势:

  

还有另一种方法,其中序列化pr oxy模式更多   比防御性复制强大。序列化代理模式   允许反序列化的实例具有与之不同的类   最初序列化的实例。

作为一个例子,他提供了EnumSet的序列化代理,如下所示(doc comments ommited):

private static class SerializationProxy <E extends Enum<E>>
    implements java.io.Serializable
{
    private final Class<E> elementType;
    private final Enum[] elements;

    SerializationProxy(EnumSet<E> set) {
        elementType = set.elementType;
        elements = set.toArray(ZERO_LENGTH_ENUM_ARRAY);
    }

    private Object readResolve() {
        EnumSet<E> result = EnumSet.noneOf(elementType);
        for (Enum e : elements)
            result.add((E)e);
        return result;
    }

    private static final long serialVersionUID = 362491234563181265L;
}

我不明白为什么我们不能只使用readResolve方法来做到这一点?我们正确地使用EnumSet方法预设readObject并将readResolve()应用于反序列化对象。这很痛苦,但它会起作用。

1 个答案:

答案 0 :(得分:1)

  

序列化代理模式允许反序列化的实例与最初的序列化实例具有不同的类。

此声明以及您发布的代码在没有硬币的另一面的情况下毫无意义:writeReplace() EnumSet方法。除非该方法返回SerializationProxy,否则您发布的所有代码都不会被执行,并且没有评论适用。

writeReplace()readResolve()作为一对的目的是原始类根本不是序列化的,而是代理,通过写-replace mechanics,该代理通过读取解析机制将自身解析为原始类的实例。