序列化和反序列化破坏单例模式的解决方法

 

我们知道单利模式可以确保在系统中只存在唯一实例,不过当序列化遇到单例时,里边就有了个问题:从内存读出而组装的对象破坏了单例的规则。为了解决这个问题提供一下两种解决方案:
 

单利类1
public class Singleton implements Serializable {
        private Singleton() {
                System.out.println("实例化");
        }

        private static class LazyHolder {
                static final Singleton INSTANCE = new Singleton();
        }

        public static Singleton getInstance() {
                return LazyHolder.INSTANCE;
        }

        private Object readResolve(){
                return LazyHolder.INSTANCE;
        }
}
public enum EmpsStatus implements Serializable {
        LOGIN(100,"用户登录");

        private Integer code;
        private String msg;

        private EmpsStatus(Integer code,String msg) {
                this.code=code;
                this.msg=msg;
        }

        public Integer getCode() {
                return code;
        }

        public void setCode(Integer code) {
                this.code = code;
        }

        public String getMsg() {
                return msg;
        }

        public void setMsg(String msg) {
                this.msg = msg;
        }
}



测试代码:

public class MainTest {

        @Test
        public void test()throws Exception {
                Singleton s1=null;
                Singleton s = Singleton.getInstance();
                //先将实例串行化到文件
                FileOutputStream fos=new FileOutputStream("sersingleton.txt");
                ObjectOutputStream oos=new ObjectOutputStream(fos);
                oos.writeObject(s);
                oos.flush();
                oos.close();
                //从文件读出原有的单例类
                FileInputStream fis =new FileInputStream("Sersingleton.txt");
                ObjectInputStream ois=new ObjectInputStream(fis);
                s1=(Singleton)ois.readObject();
                Assert.assertEquals(s,s1);
        }

        @Test
        public void test2()throws Exception {
                FileOutputStream fos=new FileOutputStream("sersingleton.txt");
                ObjectOutputStream oos=new ObjectOutputStream(fos);
                oos.writeObject(EmpsStatus.LOGIN);
                oos.flush();
                oos.close();
                FileInputStream fis =new FileInputStream("Sersingleton.txt");
                ObjectInputStream ois=new ObjectInputStream(fis);
                EmpsStatus e =(EmpsStatus)ois.readObject();
                Assert.assertEquals(EmpsStatus.LOGIN,e);
        }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值