文档章节

序列化与单例

乒乓狂魔
 乒乓狂魔
发布于 2015/02/07 10:37
字数 317
阅读 131
收藏 0
当单例模式的类实现了系列化Serializable接口,也可以通过反序列化来使它不再单例。
我们的单例类:

public final class Singleton implements Serializable{

	private static final long serialVersionUID = 1735776740157142434L;
	
	private static final Singleton instance=new Singleton();
	
	private Singleton(){}
	
	public static Singleton getInstance(){
		return instance;
	}
}

序列化和反序列化如下:
Singleton singleton1=Singleton.getInstance();
		
		FileOutputStream fileOut=new FileOutputStream("D:\\singleton.txt");
		ObjectOutputStream out=new ObjectOutputStream(fileOut);
		out.writeObject(singleton1);
		out.close();
		
		FileInputStream fileInputStream=new FileInputStream("D:\\singleton.txt");
		ObjectInputStream in=new ObjectInputStream(fileInputStream);
		Singleton singleton2=(Singleton)in.readObject();
		in.close();
		
		System.out.println(singleton1);
		System.out.println(singleton2);
		System.out.println(singleton1==singleton2);

先将singleton1序列化到一个文件中,然后再从该文件中读取出singleton2,结果如下:
com.lg.design.singleton.hungry.Singleton@173e55db
com.lg.design.singleton.hungry.Singleton@4690d3c6
false

可以看到Singleton不能保证是一个单例类。但是解决方法(不能解决所有情况)为我们认为的干预序列化,使之返回我们自定义的对象,这就需要在Singleton 中添加一个readResolve方法,如下:
public final class Singleton implements Serializable{

	private static final long serialVersionUID = 1735776740157142434L;
	
	private static final Singleton instance=new Singleton();
	
	private Singleton(){}
	
	public static Singleton getInstance(){
		return instance;
	}
	
	private Object readResolve(){
		return instance;
	}
}

此时再次执行,singleton1和singleton2便是同一个对象了,如下:
com.lg.design.singleton.hungry.Singleton@35427e6e
com.lg.design.singleton.hungry.Singleton@35427e6e
true

有关序列化的具体详细内容,请见后续文章。

若想转载请注明出处:   http://lgbolgger.iteye.com/blog/2160592
作者:iteye的乒乓狂魔

© 著作权归作者所有

共有 人打赏支持
乒乓狂魔
粉丝 1016
博文 105
码字总数 271356
作品 0
长宁
程序员
私信 提问
为什么我墙裂建议大家使用枚举来实现单例。

关于单例模式,我的博客中有很多文章介绍过。作为23种设计模式中最为常用的设计模式,单例模式并没有想象的那么简单。因为在设计单例的时候要考虑很多问题,比如线程安全问题、序列化对单例的...

2018/06/10
0
0
单例模式被反序列化而变多例

单例模式在不考虑序列化的情况下,无论勤加载还是懒加载,均是安全的.看你代码是怎么写的了. 但当单例执行了Serializiable接口以后,就不安全了. 将单例序列化再反序列化, 单例就多了一份copy,...

xpbug
2012/11/07
486
2
如何防止单例模式被JAVA反射攻击

单例模式相信大家都知道,用过的人不在少数。之前写过一篇博文《singleton模式四种线程安全的实现》(参见:http://blog.csdn.NET/u013256816/article/details/50427061),讲诉了单例模式的...

vshcxl
2016/11/28
8
0
深度解析单例与序列化之间的爱恨情仇~

转载:原文链接:https://mp.weixin.qq.com/s/iXC47w4tMfpZzTNxS_JQOw 首先来写一个单例的类:code 1 接下来是一个测试类: code 2 输出结构为false,说明: 通过对Singleton的序列化与反序列化...

u010398771
2018/02/04
0
0
单例模式Singleton

单例模式定义 确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 单例模式类图 类图说明 Client:高层客户类 Singleton:单例类 实现单例模式的要点 构造函数不对外开放,一...

Gnepux
2016/11/28
2
0

没有更多内容

加载失败,请刷新页面

加载更多

C#默认OrderBy()函数的排序问题

昨天在客户现场遇到一个很奇葩的问题,猜下下面代码的排序输出是什么: static void Main(){ List<string> strs = new List<string>(){"11", "12", "1:"}; foreach(string str i......

Airship
26分钟前
2
0
Vue调试神器Vue.js devtools

前言: Vue.js devtools是一个高效的vue项目可视化检查工具,其主要功能就是可以快速查看页面结构、组件中的data变量、computed计算属性、props父组件传过来的值等等 Chrome上的使用方法: 科学...

JamesView
32分钟前
14
0
最全面的IGMP协议总结!

IGMP互联网组管理协议是TCP/IP 协议族中负责IP组播成员管理的协议,用来在IP主机和与其直接相邻的组播路由器之间建立、维护组播组成员关系。 一、IGMP 简介 IGMP(Internet Group Management...

linuxprobe16
36分钟前
1
0
node-sass 安装失败的各种坑

开始的时候引入别人的一个项目 npm install npm run dev 启动项目 报错 > sell@1.0.0 dev E:\web_hwf\Vue\02app > node build/dev-server.js Listening at http://localhost:8888 webpack: w......

黑魔法
37分钟前
1
0
Qemu中PCI设备透传(PCI-Assign)源码分析

在网上看到很多人说Qemu的PCI-Assign透传不支持IOMMU,而VFIO透传却可以(还被当做一种优势进行推荐)。而VFIO跟SRIOV并非有必然联系,那就是说VFIO和PCI-Assign进本都是靠软件实现的了?既然...

LastRitter
39分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部