首页 > 其他分享 >【设计模式】单例模式——反序列化破坏单例模式的情景

【设计模式】单例模式——反序列化破坏单例模式的情景

时间:2024-01-03 16:32:11浏览次数:32  
标签:Singleton 设计模式 对象 单例 new 序列化 singletonSerializable

一个单例对象创建好之后,有时候需要将对象序列化然后进行数据持久化,下次使用的时候通过反序列化转化为内存对象。反序列化后的对象会重新分配内存,会破坏单例模式。

首先看支持序列化的单例类的代码:

// 实现Serializable即可实现序列化和反序列化
public class Singleton implements Serializable {
    private static Singleton instance = new Singleton();
    private Singleton(){}

    public static Singleton getInstance(){
        return instance;
    }
}

测试代码如下所示:

Singleton singleton = Singleton.getInstance();
Singleton singletonSerializable = null;

FileOutputStream fos = null;
try {
		fos = new FileOutputStream("Singleton.obj");
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(singletonSerializable);
    oos.flush();
    oos.close();

    FileInputStream fis = new FileInputStream("Singleton.obj");
    ObjectInputStream ois = new ObjectInputStream(fis);
    singletonSerializable = (Singleton) ois.readObject();
    ois.close();

    System.out.println("比较原型对象与反序列化对象:"+(singleton == singletonSerializable));
} catch (Exception e) {
    e.printStackTrace();
}

运行结果:

比较原型对象与反序列化对象:false

可见单例模式会被反序列化破坏。

除了Java自带的反序列化方式以外,实际开发过程中更常见的是用FastJson或Moshi等开源框架将对象序列化成JSON或Protobuf,以下是测试Gson反序列化破坏单例的代码:

Gson gson = new Gson();
String json = gson.toJson(singleton);
singletonSerializable = gson.fromJson(json,Singleton.class);

System.out.println("比较原型对象与反序列化对象:"+(singleton == singletonSerializable));

运行结果:

比较原型对象与反序列化对象:false

可见单例模式也会被JSON等其他格式的反序列化破坏,Jackson等其他框架同理。


标签:Singleton,设计模式,对象,单例,new,序列化,singletonSerializable
From: https://blog.51cto.com/dongfeng9ge/9086690

相关文章

  • 设计模式--单例模式
    设计模式是软件工程中共同的问题的解决方案,这些方案经过了验证和总结,能够在不同的情境中提供最佳的解决途径。设计模式主要分为三类:创建型模式、结构型模式和行为型模式。以下是这三类模式中的23个经典设计模式的列表:创建型模式(CreationalPatterns):创建型模式涉及对象的初始化和......
  • Java设计模式-策略模式
    简介策略模式是指有一定行动内容的相对稳定的策略名称,策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法策略模式:定义了一组算法(业务规则)封装了每个算法这族的算法可互换代替组成抽象策略角色:策略类,通常由一个接口或者抽象类实现具体策略角......
  • 【设计模式】单例模式——clone()方法破坏单例模式的情景
    Java的对象不仅可以new关键字产生,也可以利用clone()方法产生,或者利用反射和反序列化产生。用DCL或静态内部类实现单例模式都是利用private修饰构造函数来解决new关键字产生多个对象的问题的,但单例模式仍然可以被clone()方法、反射和反序列化破坏。如下代码所示,让单例类实现Cloneabl......
  • 小谈设计模式(28)—解释器模式
    (小谈设计模式(28)—解释器模式)专栏介绍主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。解释器模式解释器模式是一种行为型设计模式,它提供了一种解释一个语言的方式,用于解析......
  • js设计模式之单例模式
    //字面量constlogi={name:"贾维斯",password:'123456',method:function(){}}/***闭包:*1.闭包是指有权访问另一个函数作用域中的变量的函数*2.创建闭包的常见方式,就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,*优点:*......
  • Spring如何利用三级缓存解决单例Bean的循环依赖
    循环依赖:就是N个类循环(嵌套)引用。通俗的讲就是N个Bean互相引用对方,最终形成闭环。用一幅经典的图示可以表示成这样(A、B、C都代表对象,虚线代表引用关系):注意:其实可以N=1,也就是极限情况的循环依赖:自己依赖自己可以设想一下这个场景:如果在日常开发中我们用new对象的方式,若构造......
  • Java 中设计模式
    Java中一般认为有23种设计模式,当然暂时不需要所有的都会,但是其中常见的几种设计模式应该去掌握。总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模......
  • 策略设计模式(Strategy)
    策略设计模式(Strategy):可以整体的替换一个算法的实现部分,能够整体的替换算法,能让我们轻松地用不同方法解决同一个问题。 1. 示例程序举一个收银的例子,普通用户打95折,会员打8折,超级会员打6折。如果在一个函数里面去解决这些问题,那么增加会员类型和折扣变化的时候会导致代码臃肿,难......
  • 桥接设计模式 (Bridge)
    1.问题引出实现某件产品,某产品有多种品牌(brand)和类型(kind)。比较直观的一种实现方式,多重继承如下图所示,多重继承的两大缺点:会导致有过多的类(类的数量=品牌数量*类型数量);新增品牌则需要新增所有的类型类,新增类型则需要新增所有的品牌类,违反了单一职责原则(单一职责原则:对类来说的,即......
  • 23.page object 设计模式
    目录 pageobject模式简介pageobject设计原则pageobject模式简介 马丁福勒个人博客selenium官网传统UI自动化的问题无法适应UI频繁变化无法清晰表达业务用例场景大量的样板代码driver/find/clickPOM模式的优势降低UI变......