写singleton类需要注意的一点问题(Sington类的序列化)
2012-03-27 11:20
381 查看
为了使Singleton类变成可序列化的(serializable),仅仅实现Serializable接口是不够的。为了维护Singleton的单例性,你必须给Singleton类提供一个readResolve方法,否则的话,一个序列化的实例,每次反序列化的时候都会产 生一个新的实例。Singleton 也不会例外。如下所示:
输出结果为:false
解决方法是为Singleton类增加readResolve()方法:
再进行测试:输出结果为true
反序列化之后新创建的对象会先调用此方法,该方法返回的对象引用被返回,取代了新创建的对象。
本质上,该方法忽略了新建对象,仍然返回类初始化时创建的那个实例。
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
反序列化之后新创建的对象会先调用此方法,该方法返回的对象引用被返回,取代了新创建的对象。
本质上,该方法忽略了新建对象,仍然返回类初始化时创建的那个实例。
相关文章推荐
- 有关ScrollView嵌套WebView使用时需要注意的一点小问题
- Android中继承Parcelable序列化对象需要注意的问题,记录!
- .net 序列化时,需要注意的一些问题
- python序列化持久化需要注意的一个问题
- 使用GetWindowText需要注意的一点问题
- spring-data-redis 使用过程中需要注意的一点(序列化选择)
- 安装使用WDS时需要注意的一点问题
- anti-CSRF Token布署时需要注意的一点问题
- 使用qApp->quit();退出程序需要注意的一点问题
- anti-CSRF Token布署时需要注意的一点问题
- JavaScriptSerializer类序列化日期时需要注意的问题
- anti-CSRF Token布署时需要注意的一点问题
- Html使用自定义光标的一点需要注意的小问题。
- flash与asp.net交互需要注意的一点问题
- win7安装win8.1双系统需要注意的一点事
- VC工程需要注意字符集问题
- 网站改版需要注意的优化问题
- ARC下需要注意的内存问题
- 安装NetWeaver需要注意的几个问题(www.mynetweaver.cn)
- vs.net中使用SuperMap需要注意的问题[转载]