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

posted @ 2017-12-22 18:28  hongdada  阅读(3467)  评论(0编辑  收藏  举报