单例模式序列或反射破坏单例模式产生的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();
    }

}

 

上一篇:Spring统一异常处理之@ControllerAdvice


下一篇:Elasticsearch安装以及语法学习