為了使乙個單例類變成可序列化的,僅僅在宣告中新增「implements serializable」是不夠的。因為乙個序列化的物件在每次返序列化的時候,都會建立乙個新的物件,而不僅僅是乙個對原有物件的引用。為了防止這種情況,可以在單例類中加入readresolve 方法。
下面我們先簡要地回顧下物件的序列化. 一般來說, 乙個類實現了 serializable介面, 我們就可以把它往記憶體地寫再從記憶體裡讀出而"組裝"成乙個跟原來一模一樣的物件. 不過當序列化遇到單例時,這裡邊就有了個問題: 從記憶體讀出而組裝的物件破壞了單例的規則. 單例是要求乙個jvm中只有乙個類物件的, 而現在通過反序列化,乙個新的物件轉殖了出來.
如下例所示:
單例設計模式 序列化破壞單例模式?
1 問題猜想,假如將乙個物件通過序列化放到乙個檔案後,再取出來看是否與本身相等?public class hungrysingleton implements serializable private hungrysingleton public static hungrysingleton get...
單例模式5 1(序列化破壞單例)
之前見過可以通過反射來破壞單例,和如何防止被破壞。今天講一下序列化破壞單例。新建類 serializablesingletion,其實就是餓漢式單例,只是實現了serializable介面 public class serializablesingletion implements serializ...
序列化與單例
當單例模式的類實現了系列化serializable介面,也可以通過反序列化來使它不再單例。我們的單例類 12 3 4 5 6 7 8 9 10 11 12 publicfinalclasssingletonimplementsserializable publicstaticsingleton ge...