當單例模式的類實現了系列化serializable介面,也可以通過反序列化來使它不再單例。
我們的單例類:?
12
3
4
5
6
7
8
9
10
11
12
public
final
class
singleton
implements
serializable
public
static
singleton getinstance()
}
序列化和反序列化如下:?
12
3
4
5
6
7
8
9
10
11
12
13
14
15
singleton singleton1=singleton.getinstance();
fileoutputstream fileout=
new
fileoutputstream(
"d:\\singleton.txt"
);
objectoutputstream out=
new
objectoutputstream(fileout);
out.writeobject(singleton1);
out.close();
fileinputstream fileinputstream=
new
fileinputstream(
"d:\\singleton.txt"
);
objectinputstream in=
new
objectinputstream(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
public
final
class
singleton
implements
serializable
public
static
singleton getinstance()
private
object 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 方法。下面我們先簡要地回顧下物件的序...