序列化與單例

2021-09-23 21:41:48 字數 3200 閱讀 3451

當單例模式的類實現了系列化serializable介面,也可以通過反序列化來使它不再單例。 

我們的單例類:?

12

3

4

5

6

7

8

9

10

11

12

publicfinalclasssingletonimplementsserializable

publicstaticsingleton getinstance()

}

序列化和反序列化如下:?

12

3

4

5

6

7

8

9

10

11

12

13

14

15

singleton singleton1=singleton.getinstance();

fileoutputstream fileout=newfileoutputstream("d:\\singleton.txt");

objectoutputstream out=newobjectoutputstream(fileout);

out.writeobject(singleton1);

out.close();

fileinputstream fileinputstream=newfileinputstream("d:\\singleton.txt");

objectinputstream in=newobjectinputstream(fileinputstream);

singleton singleton2=(singleton)in.readobject();

in.close();

system.out.println(singleton1);

system.out.println(singleton2);

system.out.println(singleton1==singleton2);

先將singleton1序列化到乙個檔案中,然後再從該檔案中讀取出singleton2,結果如下:?

12

3

com.lg.design.singleton.hungry.singleton@173e55db

com.lg.design.singleton.hungry.singleton@4690d3c6

false

可以看到singleton不能保證是乙個單例類。但是解決方法(不能解決所有情況)為我們認為的干預序列化,使之返回我們自定義的物件,這就需要在singleton 中新增乙個readresolve方法,如下:?

12

3

4

5

6

7

8

9

10

11

12

13

14

15

16

publicfinalclasssingletonimplementsserializable

publicstaticsingleton getinstance()

privateobject readresolve()

}

此時再次執行,singleton1和singleton2便是同乙個物件了,如下:?

12

3

com.lg.design.singleton.hungry.singleton@35427e6e

com.lg.design.singleton.hungry.singleton@35427e6e

true

有關序列化的具體詳細內容,請見後續文章。 

單例設計模式 序列化破壞單例模式?

1 問題猜想,假如將乙個物件通過序列化放到乙個檔案後,再取出來看是否與本身相等?public class hungrysingleton implements serializable private hungrysingleton public static hungrysingleton get...

單例 序列化和readResolve 方法

說到這個話題,我先丟擲單例的餓漢式寫法 單例 餓漢式 public class hungrysingleton private static final hungrysingleton hungry new hungrysingleton public static hungrysingleton ...

單例模式及單例物件的可序列化

為了使乙個單例類變成可序列化的,僅僅在宣告中新增 implements serializable 是不夠的。因為乙個序列化的物件在每次返序列化的時候,都會建立乙個新的物件,而不僅僅是乙個對原有物件的引用。為了防止這種情況,可以在單例類中加入readresolve 方法。下面我們先簡要地回顧下物件的序...