zoukankan      html  css  js  c++  java
  • Java设计模式之使用反序列化的方式实现单例模式

    package com.sinosoft.test;

    import java.io.Serializable;

    /**
    * 使用序列化的方式实现单例模式
    */
    public class HungrySingleton implements Serializable {
    private static HungrySingleton instance=new HungrySingleton();

    public static HungrySingleton getInstance(){
    return instance;
    }

    private HungrySingleton(){

    }
    }

    创建测试类;实现序列化到此判断过程
    package com.sinosoft.test;

    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;

    /**
    * Created by ZhaoYongqiang on 2020/8/30.
    */
    public class SerializableTest {
    public static void main(String[] args) throws FileNotFoundException,IOException,ClassNotFoundException {
    HungrySingleton instance=HungrySingleton.getInstance();

    ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("instance"));
    outputStream.writeObject(instance);
    outputStream.close();
    System.out.println("序列化到磁盘成功");
    //
    // ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("instance"));
    // HungrySingleton object =(HungrySingleton) objectInputStream.readObject();
    // System.out.println("反序列化成功");

    }
    }
    运行结果:

    可见是能够序列化成功的。

    接下来在进行反序列化,代码在上面:

     接下来我们看一下序列化和反序列化是否是同一个实例:

    package com.sinosoft.test;

    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;

    /**
    * Created by ZhaoYongqiang on 2020/8/30.
    */
    public class SerializableTest {
    public static void main(String[] args) throws FileNotFoundException,IOException,ClassNotFoundException {
    HungrySingleton instance=HungrySingleton.getInstance();

    ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("instance"));
    outputStream.writeObject(instance);
    outputStream.close();
    System.out.println("序列化到磁盘成功");

    ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("instance"));
    HungrySingleton object =(HungrySingleton) objectInputStream.readObject();
    objectInputStream.close();
    System.out.println(object);
    System.out.println("反序列化成功");

    System.out.println("序列化和反序列化是否是同一个实例:"+(instance==object));
    }
    }

    运行结果:

    序列化到磁盘成功
    com.sinosoft.test.HungrySingleton@12edcd21
    反序列化成功
    序列化和反序列化是否是同一个实例:false

    可见,已经不是同一个实例了。

    那么怎样解决这种问题呢?指定签名

    package com.sinosoft.test;

    import java.io.ObjectStreamException;
    import java.io.Serializable;

    /**
    * 使用序列化的方式实现单例模式
    */
    public class HungrySingleton implements Serializable {
    private static HungrySingleton instance=new HungrySingleton();

    public static HungrySingleton getInstance(){
    return instance;
    }

    private HungrySingleton(){

    }

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

    再次运行:

    序列化到磁盘成功
    com.sinosoft.test.HungrySingleton@4d7e1886
    反序列化成功
    序列化和反序列化是否是同一个实例:true

    这个序列化ID加不加都是可以的。

    private final long serialVersionUID=42L;
  • 相关阅读:
    Thymeleaf标签使用
    mybatis映射和条件查询
    开发模型
    Sentinel降级服务
    Sentinel
    Nacos注册中心
    SpringCloudAlibaba简介
    Sleuth
    Stream消息驱动
    如何用JAVA爬取AJAX加载后的页面(利用phantomjs)【以天眼查为例】
  • 原文地址:https://www.cnblogs.com/dongyaotou/p/13584685.html
Copyright © 2011-2022 走看看