1. 程式人生 > >設計模式之單例模式五(序列化與反序列化破壞)

設計模式之單例模式五(序列化與反序列化破壞)

單例模式的核心是要保證單例,但是在將一個例項序列化到一個檔案中後,再反序列化得到一個例項,這兩個例項是不同的,這就違反了單例原則,如下面惡漢式單例模式對序列化的測試:

由上面的列印資訊可知得到的是兩個不同的例項,通過除錯跟程式碼可以很容易發現,在反序列化時通過反射newInstance了一個新的例項,我們可以通過下面方法防止這種序列化與反序列化的破壞:

上面的輸出資訊中可以看到現在已經是同一個物件了,只是在HungrySingleton中加了一個readResolve方法,在這個方法中返回了原來的例項,這個方法在反序列化時被反射呼叫,如果定義了這個方法,就返回這個方法的值,如果沒有定義,則返回新new出來的物件。在除錯打斷點跟蹤過程中很容易發現,由於是反射呼叫,裡面的Method物件已經規定了呼叫時的方法名為readResolve,在這裡我們才加這樣名稱的一個方法。