单例的序列化与反序列化

本文探讨了单例模式在序列化过程中面临的问题,并通过实现瞬时实例与readResolve方法来确保序列化前后单例的一致性。文章提供了完整的代码示例及运行结果。

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

一:背景

    单例在序列化时,仅仅实现序列化接口(implements Serializable)是没有用的,它在反序列化时,会每次都去创建一个新的实例。


二:如何解决

    声明所有的实例域都是瞬时的(transient) ,且提供一个readResolve()方法。


三:测试代码

     

package com.eden.coreLearn.javacore;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectStreamException;
import java.io.Serializable;

/**
 * 类SingleClass.java的实现描述:TODO 类实现描述
 * 
 * @author wangding_91@163.com 2016年3月15日 下午5:21:54
 */
public class SingleClass implements Serializable {

    private String             name             = "dingwang";
    /**
     * 
     */
    private static final long  serialVersionUID = -3019013760713539747L;
    private static SingleClass instance         = null;

    private SingleClass() {
    }

    public static SingleClass getInstance() {
        if (instance == null) {
            instance = new SingleClass();
        }
        return instance;
    }

    public String getName() {
        return name;
    }

    private Object readResolve() throws ObjectStreamException {
        return instance;
    }

    public void setName(String name) {
        this.name = name;
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        SingleClass single = SingleClass.getInstance();
        System.out.println("hashCode1=" + single.hashCode());
        File singleFile = new File("E:/single.txt");
        if (!singleFile.exists()) {
            singleFile.createNewFile();
        }
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(singleFile));
        oos.writeObject(single);
        oos.close();

        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(singleFile));
        Object obj = null;
        while ((obj = ois.readObject()) != null) {
            SingleClass s = (SingleClass) obj;
            System.out.println("hashCode2=" + s.hashCode() + "===========" + s.getName());
        }
        ois.close();
    }
}


四:运行结果

      

hashCode1=705927765
hashCode2=705927765===========dingwang

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值