单例模式与序列化
2016-04-14 00:00
190 查看
一个类实现了Serializable接口,我们就能对它的对象序列化,即把对象转换成字节数组写到内存或磁盘。反序列化时,读取内存(磁盘)中的字节数组,转换成类的对象,这个对象是一个全新的对象,和原来对象的地址是不一样的。这个过程调用了
readResolve()方法。为了避免单例的破坏,我们需要重写这个方法。
readResolve()方法。为了避免单例的破坏,我们需要重写这个方法。
public class TestSingleton { public static void main(String[] args) throws Exception { /** * 这样打印出的TestSingleton对象地址一致, * 说明依然是单例对象 * 把readResolve方法注释掉再来一遍看看呢? */ System.out.println(Singleton.getInstance()); System.out.println(Singleton.getInstance().deepCopy()); } } //单例 class Singleton implements Serializable { private static final long serialVersionUID = 1; private Singleton() { } private static class Holder { private static Singleton singleton = new Singleton(); } public static Singleton getInstance() { return Holder.singleton; } //重写readResolve() private Object readResolve() throws ObjectStreamException { return getInstance(); } public Singleton deepCopy() throws Exception { ByteArrayOutputStream os = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(os); oos.writeObject(Singleton.getInstance()); InputStream is = new ByteArrayInputStream(os.toByteArray()); ObjectInputStream ois = new ObjectInputStream(is); Singleton test = (Singleton) ois.readObject(); return test; } }
相关文章推荐
- 计算一个对象占用的内存大小
- 常用的位运算:int与byte[]互相转换
- 使用Spring Data Redis实现缓存遇到的一些问题
- 超低功耗水气表GSM/GPRS无线抄表模块
- 【企业网盘】漫云端,获取的不单是快捷,还有高效的办公!
- 简单认识云计算
- Java——基础类库
- Emacs Lisp 15 分钟入门
- Emacs模式(Mode)
- 横向ListView
- CXF spring jaxws:endpoint 与 jaxws:server 区别 与 关系
- 新人入住,请多关照!
- RESTful WebService
- Java多线程编程基础
- MJExtension
- EXRefresh
- warning: Could not resolve external type c:objc(cs
- PostgreSQL事务处理机制 (&与MySQL之间比较)
- 数据库专业词汇 DDL、DML和DCL 理解
- 数据库 事务 ACID解释