测试序列化和反序列化对单例的破坏(以饿汉式为例)
破坏的原因解析:
反序列化的时候通过反射newInstance 重新生成了一个类 所以和原有的类不是同一个
解决办法:
在单例类中重写一个方法:readResolve 返回单例类 底层代码在执行的过程中虽然还会通过反射重新创建单例,但是最终会调用这个方法,从而返回原始的单例
public class HungarySingleton implements Serializable{
private static final HungarySingleton hungarySingleton;
static {
hungarySingleton = new HungarySingleton();
}
private HungarySingleton() {
}
public static HungarySingleton getInstance() {
return hungarySingleton;
}
//解决序列化和反序列化对单例的破坏
private Object readResolve() {
return hungarySingleton;
}
}
HungarySingleton instance = HungarySingleton.getInstance();
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("singleton_file"));
oos.writeObject(instance);
File file = new File("singleton_file");
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
HungarySingleton newInstance = (HungarySingleton) ois.readObject();
System.err.println(instance);
System.err.println(newInstance);
System.out.println(instance == newInstance);