gpt4 book ai didi

java - 了解序列化代理

转载 作者:行者123 更新时间:2023-12-01 10:44:24 24 4
gpt4 key购买 nike

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

There is another way in which the serialization pr oxy pattern is more powerful than defensive copying. The serialization proxy pattern allows the deserialized instance to have a different class from the originally serialized instance.

作为示例,他提供了 EnumSet 的序列化代理,如下所示(省略了文档注释):

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 方法来做到这一点?我们使用 readObject 方法正确反序列化 EnumSet 并将 readResolve() 应用于反序列化的对象。这很痛苦,但它会起作用。

最佳答案

The serialization proxy pattern allows the deserialized instance to have a different class from the originally serialized instance.

如果没有硬币的另一面:EnumSetwriteReplace() 方法,此语句以及您发布的代码就没有意义。除非该方法返回 SerializationProxy,否则您发布的任何代码都不会被执行,并且所有注释都不适用。

writeReplace()readResolve() 成对使用的目的是,原始类根本不被序列化,而是一个代理,通过写入替换机制,并且该代理通过读取解析机制将自身解析为原始类的实例。

关于java - 了解序列化代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34262916/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com