单例模式与序列化

本文介绍了如何在Java中实现单例模式,并讨论了当单例对象被序列化和反序列化时,如何通过重写readResolve()方法来确保单例模式不被破坏。提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   一个类实现了Serializable接口,我们就能对它的对象序列化,即把对象转换成字节数组写到内存或磁盘。反序列化时,读取内存(磁盘)中的字节数组,转换成类的对象,这个对象是一个全新的对象,和原来对象的地址是不一样的。这个过程调用了

readResolve()方法。为了避免单例的破坏,我们需要重写这个方法。

public class TestSingleton {

    public static void main(String[] args) throws Exception {
        /**
         * 这样打印出的TestSingleton对象地址一致,
         * 说明依然是单例对象
         * 把readResolve方法注释掉再来一遍看看呢?
         */
        System.out.println(Singleton.getInstance());
        System.out.println(Singleton.getInstance().deepCopy());
    }
}

//单例
class Singleton implements Serializable {
    private static final long serialVersionUID = 1;

    private Singleton() {
    }

    private static class Holder {
        private static Singleton singleton = new Singleton();
    }

    public static Singleton getInstance() {
        return Holder.singleton;
    }

    //重写readResolve()
    private Object readResolve() throws ObjectStreamException {
        return getInstance();
    }

    public Singleton deepCopy() throws Exception {
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(os);
        oos.writeObject(Singleton.getInstance());

        InputStream is = new ByteArrayInputStream(os.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(is);
        Singleton test = (Singleton) ois.readObject();
        return test;
    }

}


转载于:https://my.oschina.net/u/1537182/blog/659726

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值