1. 程式人生 > 其它 >單例模式序列或反射破壞單例模式產生的Exception in thread "main" java.io.InvalidClassException:錯誤

單例模式序列或反射破壞單例模式產生的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(); } }