序列化破环单例模式,实例代码如下:
(1) 饿汉式单例模式,实现了序列化接口
public class SeriableSingleton implements Serializable{
private static final SeriableSingleton instance=new SeriableSingleton();
private SeriableSingleton(){}
public static SeriableSingleton getInstance(){
return instance;
}
}
(2) 对单例模式进行序列化和反序列化破坏
public class SeriableSingletonTest {
public static void main(String[] args) {
SeriableSingleton s1=null;
SeriableSingleton s2=SeriableSingleton.getInstance();
FileOutputStream fos=null;
ObjectOutputStream oos=null;
FileInputStream fis=null;
ObjectInputStream ois=null;
try {
fos=new FileOutputStream("SeriableSingleton.obj");
oos=new ObjectOutputStream(fos);
oos.writeObject(s2);
oos.flush();
oos.close();
fis=new FileInputStream("SeriableSingleton.obj");
ois=new ObjectInputStream(fis);
s1=(SeriableSingleton)ois.readObject();
ois.close();
System.out.println(s1);
System.out.println(s2);
System.out.println(s1==s2);
} catch (Exception e) {
e.printStackTrace();
}
}
}
此段代码执行结果如下:
com.wxz.designpattern.singleton.SeriableSingleton@7ba4f24f
com.wxz.designpattern.singleton.SeriableSingleton@6d6f6e28
false
由代码执行结果可看出,对单例模式执行完序列化和反序列化后,创建了新的对象,破坏了单例模式,违背了单例模式设计初衷。
(3) 如何保证序列化方式下也能实现单例?
解决方法很简单,只需要在单例类中增加readResolve()方法,代码如下:
public class SeriableSingleton implements Serializable{
private static final SeriableSingleton instance=new SeriableSingleton();
private SeriableSingleton(){}
public static SeriableSingleton getInstance(){
return instance;
}
public Object readResolve(){
return instance;
}
}
再次执行SeriableSingletonTest测试方法,执行结果如下:
com.wxz.designpattern.singleton.SeriableSingleton@6d6f6e28
com.wxz.designpattern.singleton.SeriableSingleton@6d6f6e28
true
由此可见,增加readResolve()方法后解决了序列化方法对单例模式的破坏。