• 如何对单例模式的类进行序列化与反序列化


     演示了如何对单例模式的类进行序列化与反序列化

     单例模式一般不会进行序列化与反序列化的,但是如果执行了序列化,再反序列化时得到对象将不再是单例模式的对象。
     而readResolve()方法提供了将替换反序列化后的对象的机会。

     1 package Pattern;
     2 
     3 import java.io.FileInputStream;
     4 import java.io.FileOutputStream;
     5 import java.io.ObjectInputStream;
     6 import java.io.ObjectOutputStream;
     7 import java.io.ObjectStreamException;
     8 import java.io.Serializable;
     9 
    10 import org.junit.Assert;
    11 
    12 /**
    13  * @author LPX
    14  *
    15  */
    16 public class SerializableSingleton implements Serializable {
    17     private SerializableSingleton(){
    18         System.out.println("construct");
    19     }
    20     
    21     private static SerializableSingleton instance=null;
    22     private static class SingletonHolder{
    23         public static SerializableSingleton holder=new SerializableSingleton();
    24     }
    25     
    26     public static SerializableSingleton getInstance(){
    27         return SingletonHolder.holder;
    28     }
    29     
    30     /**
    31      * 该方法是反序列化调用函数,用于对反序列化的数据时代替反序列化出的对象
    32      * @return
    33      * @throws ObjectStreamException
    34      */
    35     private Object readResolve() throws ObjectStreamException{
    36         return this.getInstance();
    37     }
    38     
    39     public static void main(String[] args) throws Exception{
    40         SerializableSingleton instance=SerializableSingleton.getInstance();
    41         
    42         //序列化
    43         FileOutputStream fos=new FileOutputStream("data.db");
    44         ObjectOutputStream oos=new ObjectOutputStream(fos);
    45         oos.writeObject(instance);
    46         
    47         //反序列化
    48         ObjectInputStream ois=new ObjectInputStream(new FileInputStream("data.db"));
    49         SerializableSingleton tmp=(SerializableSingleton) ois.readObject();
    50         
    51         Assert.assertEquals("验证未通过", tmp, SerializableSingleton.getInstance());
    52         System.out.println("通过验证");
    53     }
    54 }
  • 相关阅读:
    css 基础
    css 基础-1
    html 入门2-表
    CMDB (后台管理) CURD 插件
    序列化
    AES(高级加密)
    API验证
    数据库取时间(分组)
    用户权限 (知识点)
    xss 过滤
  • 原文地址:https://www.cnblogs.com/bjwylpx/p/3681050.html
Copyright © 2020-2023  润新知