单例模式序列或反射破坏单例模式产生的Exception in thread "main" java.io.InvalidClassException:错误
package com.itheima.pattern.singleton.demo7;
import java.io.Serializable;
public class Singleton implements Serializable{
// 私有构造方法
private Singleton(){}
//定义一个静态内部类
private static class SingletonHolder implements Serializable {
//在内部类中声明并初始化外部类的对象
private static final Singleton Instance = new Singleton();
}
//提供一个外部的公共访问方式
public static Singleton getInstance(){
return SingletonHolder.Instance;
}
//当进行反序列化时,会自动调用该方法,将该方法的返回值直接返回
//加上这个方法就不报错了
public Object readResolve(){
return SingletonHolder.Instance;
}
}
package com.itheima.pattern.singleton.demo7; import java.io.*; /** * 测试使用反射破坏单例模式 */ public class Client { public static void main(String[] args) throws Exception { // writeObject2File(); readObjectFromFile(); // readObjectFromFile(); } //从文件读取数据(对象) public static void readObjectFromFile() throws Exception{ //创建对象输入流对象 ObjectInputStream ois =new ObjectInputStream( new FileInputStream("C:\\Users\\Administrator\\Desktop\\a.txt" ) ); //读取对象 Singleton instance = (Singleton) ois.readObject(); System.out.println(instance); //释放资源 ois.close(); } // 向文件中写数据(对象) public static void writeObject2File() throws Exception { //1.获取singleton对象 Singleton instance =Singleton.getInstance(); //2.创建对象输出流对象 ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream( "C:\\Users\\Administrator\\Desktop\\a.txt" ) ); //3.写对象 oos.writeObject( instance ); //4.释放资源 oos.close(); } }