ReadResolve方法與序列化


使用枚舉實現的單例模式,不但可以防止利用反射強行構建單例對象,而且可以在枚舉類對象被反序列化的時候,保證反序列的返回結果是同一對象。

對於其他方式實現的單例模式,如果既想要做到可序列化,又想要反序列化為同一對象,則必須實現readResolve方法。

 一般來說, 一個類實現了 Serializable接口, 我們就可以把它往內存地寫再從內存里讀出而"組裝"成一個跟原來一模一樣的對象.

不過當序列化遇到單例時,這里邊就有了個問題: 從內存讀出而組裝的對象破壞了單例的規則. 單例是要求一個JVM中只有一個類對象的, 而現在通過反序列化,一個新的對象克隆了出來,與以前序列化的對象不能equlas。

單例模式code:

package com.qhong.designmodel.single;


public final class MySingleton  {
    private MySingleton() { }
    private static final MySingleton INSTANCE = new MySingleton();
    public static MySingleton getInstance() { return INSTANCE; }
    
}

 

反序列化出同一個對象:

package com.qhong.designmodel.single;


import java.io.ObjectStreamException;
import java.io.Serializable;

public final class MySingleton implements Serializable {
    private MySingleton() { }
    private static final MySingleton INSTANCE = new MySingleton();
    public static MySingleton getInstance() { return INSTANCE; }
    private Object readResolve() throws ObjectStreamException {
        // instead of the object we're on,
        // return the class variable INSTANCE
        return INSTANCE;
    }
}

 

http://blog.163.com/hsh8523%40126/blog/static/218935592010520255261/

http://mp.weixin.qq.com/s/1fQkkdtzYh_OikbYJnmZWg


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM