我读过我们应该只序列化对象的逻辑部分。
当对象的物理时使用默认的序列化形式 表示与其逻辑数据内容有很大不同 四个缺点:
... //它们与默认序列化形式有关,与之无关 主题
//关于字符串的链接列表:
合理的序列化表格 对于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. 提前致谢。
答案 0 :(得分:1)
是否只能在序列化代理类中序列化对象的逻辑状态(如下所示)
那是你的引言所说的。
或者例如列表的头节点的序列化也是正确的实现细节?
这正是你的报价所警告的。
不一定我同意引文。例如,我没有原则上反对序列化链接。可能存在实际异议,例如递归深度,但这是另一回事。
很难理解为什么你必须发布这个问题,当你已经有一个受人尊敬的引用,并且你已经实现了答案,这反过来表明你已经理解了你所读到的内容。 / p>