写singleton类需要注意的一点问题(Sington类的序列化)
来源:互联网 发布:前端 后端 知乎 编辑:程序博客网 时间:2024/05/01 12:38
为了使Singleton类变成可序列化的(serializable),仅仅实现Serializable接口是不够的。为了维护Singleton的单例性,你必须给Singleton类提供一个readResolve方法,否则的话,一个序列化的实例,每次反序列化的时候都会产 生一个新的实例。Singleton 也不会例外。如下所示:
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.ObjectStreamException; import java.io.Serializable; //Singleton with final field public class Singleton implements Serializable{ private static final long serialVersionUID = 5765648836796281035L; public static final Singleton uniqueInstance = new Singleton(); private Singleton(){ } //...Remainder omitted public static void main(String[] args) throws Exception{ //序列化 ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:\\Singleton.obj")); Singleton singleton = Singleton.uniqueInstance; objectOutputStream.writeObject(singleton); objectOutputStream.close(); //反序列化 ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("D:\\Singleton.obj")); Singleton singleton2 = (Singleton)objectInputStream.readObject(); objectInputStream.close(); //比较是否原来的实例 System.out.println(singleton==singleton2); } }
输出结果为:false
解决方法是为Singleton类增加readResolve()方法:
//readResolve 方法维持了Singleton的单例属性 private Object readResolve() throws ObjectStreamException{ return uniqueInstance; }
再进行测试:输出结果为true
反序列化之后新创建的对象会先调用此方法,该方法返回的对象引用被返回,取代了新创建的对象。
本质上,该方法忽略了新建对象,仍然返回类初始化时创建的那个实例。
- 写singleton类需要注意的一点问题(Sington类的序列化)
- 使用GetWindowText需要注意的一点问题
- 写一点简单的需要注意的东西
- 序列化类注意的问题
- .net 序列化时,需要注意的一些问题
- 自定义序列化实现Externalizable接口需要注意的问题
- mysql 写计数器需要注意的问题
- PHP写接口需要注意的问题
- 写python程序需要注意的问题
- spring-data-redis 使用过程中需要注意的一点(序列化选择)
- dubbo序列化的一点注意
- Java中定义Hibernate映射类需要注意的一点
- C++模板类编写需要注意的一点
- 使用qApp->quit();退出程序需要注意的一点问题
- anti-CSRF Token布署时需要注意的一点问题
- anti-CSRF Token布署时需要注意的一点问题
- anti-CSRF Token布署时需要注意的一点问题
- flash与asp.net交互需要注意的一点问题
- Ultraedit替换语法-正则表达式使用方案
- C++开发必看 四种强制类型转换的总结
- dom4j及路径笔记
- ASP.NET Padding Oracle Vulnerability
- linux 安装 intel驱动记录
- 写singleton类需要注意的一点问题(Sington类的序列化)
- Tizen不支持原生应用开发
- Linux shell PS1设置
- Windows phone 7 大全
- 用SMOD和CMOD进行SD的用户增强
- el表达式的使用细节补充
- oracle在 32位系统上运行突破sga1.7g的方法
- Tizen Toys简介
- RTF流字符替换