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;
  • 相关阅读:
    ionic3 学习记录
    关于华为 IOT平台的框架理解
    遥测浮点数的计算 十进制浮点型转为十六进制浮点型
    关于104规约的认识补充
    Php 十六进制短浮点数转十进制,带符号位
    yii2 项目初始化
    java Socket启动服务
    ionic3 关于屏幕方向问题
    ionic3 cordova ionic-native插件
    java javac 的区别
  • 原文地址:https://www.cnblogs.com/dongyaotou/p/13584685.html
Copyright © 2011-2022 走看看