import java.io.*;
/**
* @author 苏雪夜酒
* @version 1.0
* @date 2022/5/1 13:33
* 序列化:对象转字节的过程
* 反序列化:字节转对象的过程
* 注意,要实现序列化与反序列化,需要将Java类实现Serializable接口
* 下面以饿汉式为例,进行演示
*/
public class DestroySingletonSerialize {
public static void main(String [] args){
//将对象进行输出 即序列化
try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("singleton.txt"))) {
Singleton_2 instance = Singleton_2.getInstance();
System.out.println("序列化" + instance);
oos.writeObject(instance);
}catch (Exception e){
e.printStackTrace();
}
//反序列化
try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream("singleton.txt"))){
//readObject 此方法在读取的时候,会进行判断,是否有对象,如果没有,就通过反射(源码中的,不是一般意义的反射)创建对象
Singleton_2 instance = (Singleton_2)ois.readObject();
System.out.println("反序列化" + instance);
}catch (Exception e){
e.printStackTrace();
}
}
}
//饿汉式 单例模式
class Singleton_2 implements Serializable {
//构造方法私有
private Singleton_2(){
if (singleton_1 != null){
throw new RuntimeException("不允许反射访问");
}
};
//属性私有
private static Singleton_2 singleton_1 = new Singleton_2();
//提供对外的访问方法
public static Singleton_2 getInstance(){
return singleton_1;
}
//解决序列化与反序列化对单例模式的破坏 readResolve 此方法的源码,会创建一个新的对象
private Object readResolve(){
return singleton_1;
}
}
序列化与反序列化对单例模式的破坏
猜你喜欢
转载自blog.csdn.net/mnimxq/article/details/124527230
今日推荐
周排行