【发布时间】:2014-01-17 01:56:01
【问题描述】:
我阅读了《Effective Java》,并被告知序列化代理模式与对象图包含循环的类不兼容。其实我不明白。所以我写了一个示例来验证它。如您所见:
public class A implements Serializable{
private B b;
public A(){
}
public A(B b){
this.b = b;
}
}
public class B implements Serializable{
private A a;
public B(){
}
public B(A a){
this.a = a;
}
}
public class C implements Serializable{
private A a;
private B b;
public C(A a, B b){
this.a = a;
this.b = b;
}
private Object writeReplace(){
return new SerializationProxy(this);
}
private Object readObject(ObjectInputStream in) throws InvalidObjectException{
throw new InvalidObjectException("Proxy Required!");
}
private static final class SerializationProxy implements Serializable{
private final A a;
private final B b;
SerializationProxy(C c){
this.a = c.a;
this.b = c.b;
}
private Object readResolve(){
return new C(a, b);
}
}
public static void main(String args[]) throws Exception{
C c = new C(new A(), new B());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(baos);
out.writeObject(c);
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));
c = (C)in.readObject();
}
}
但是,它执行得非常好。那么,任何人都可以向我进一步解释。非常感谢。
【问题讨论】:
-
这本书给出了什么理由?
-
@EJP:它解释说:“如果您尝试从其序列化代理的 readResolve 方法中调用对象上的方法,您将收到 ClassCastException,因为您还没有该对象,只有它的序列化代理。”
标签: java serialization