为了使一个单例类变成可串行化的,仅仅在声明中添加“implements Serializable”是不够的。因为一个串行化的对象在每次返串行化的时候,都会创建一个新的对象,而不仅仅是一个对原有对象的引用。为了防止这种情况,可以在单例类中加入readResolve 方法。
下面我们先简要地回顾下对象的序列化. 一般来说, 一个类实现了 Serializable接口, 我们就可以把它往内存地写再从内存里读出而"组装"成一个跟原来一模一样的对象. 不过当序列化遇到单例时,这里边就有了个问题: 从内存读出而组装的对象破坏了单例的规则. 单例是要求一个JVM中只有一个类对象的, 而现在通过反序列化,一个新的对象克隆了出来.
如下例所示:
public final class MySingleton implements Serializable {
private MySingleton() { }
private static final MySingleton INSTANCE = new MySingleton();
public static MySingleton getInstance() { return INSTANCE; }
}
当把 MySingleton对象(通过getInstance方法获得的那个单例对象)序列化后再从内存中读出时, 就有一个全新但跟原来一样的MySingleton对象存在了. 那怎么来维护单例模式呢?这就要用到readResolve方法了.如下所示:
public final class MySingleton implements Serializable{
private MySingleton() { }
private static final MySingleton INSTANCE = new MySingleton();
public static MySingleton getInstance() { return INSTANCE; }
private Object readResolve() throws ObjectStreamException {
// instead of the object we're on,
// return the class variable INSTANCE
return INSTANCE;
}
}
这样当JVM从内存中反序列化地"组装"一个新对象时,就会自动调用这个 readResolve方法来返回我们指定好的对象了, 单例规则也就得到了保证 。
分享到:
相关推荐
Vbs序列化/反序列化Json基类 可直接使用,bug已被我修复 Example: Dim fso, json, str, o, i Set json = New VbsJson Set fso = WScript.CreateObject("Scripting.Filesystemobject") str = fso.OpenTextFile(...
使用XStream序列化/反序列化对象
类似 google protobuf,用于序列化/反序列化 c 结构体。支持序列化为 xml/json/binary 3 种格式。
parity-wasm, 在 Rust 中,WebAssembly序列化/反序列化 奇偶校验 wasm低级WebAssembly格式库。 文档文档 Rust WebAssembly格式序列化/反序列化添加到 Cargo.toml[dependencies]parity-wasm = "0.31
消息序列化/反序列化的基准和用法。
此dll时真正能用在.net 1.1 framework 序列化/反序列化 Json用
1.2 JavaBean序列化/反序列化 1.2.1 步骤说明 普通JavaBean 嵌套JavaBean 1.3 数组和List的序列化/反序列化 1.3.1 数组的序列化/反序列化 1.3.2 List集合的序列化/反序列化 1.4 Set和Map的序列化/反序列化 1.4.1 Set...
集成多枚举类型统一序列化/反序列化处理,再也不用创建多个Adapter了 http://blog.csdn.net/atm008/article/details/51733849
序列化,并获得序列化生成的JSON文本 JsonSerializer.Serialize(x, options); 反序列化,输出反序列化后各属性的值 JsonSerializer.Deserialize(json); 适合初学者学习使用的demo!
实现了通过gson对enum的自定义转化过程,不需要预先定义enmu,并且不需要修改gson源码,在框架顶层处理基本可以达到对enum的抽象管理。
XML序列化/反序列化类,放到项目中直接使用,很方便。 SerializationHelper
什么叫反序列化? 就是再把介质中的东西还原成对象,把石子还原成人的过程。 在进行这些操作的时候都需要这个可以被序列化,要能被序列化,就得给类头加[Serializable]特性。 通常网络程序为了传输安全才这么做。不...
序列化和反序列化的封装类,只要调用就行 序列化和反序列化的封装类 序列化和反序列化的封装类 序列化和反序列化的封装类 序列化和反序列化的封装类
C++ JSON 序列化与反序列化 相关的博客文章见:http://blog.csdn.net/TragicGuy
java 对象的序列化与反序列化 java 对象的序列化与反序列化
设计模式之七种单例模式代码及ppt,包含多线程环境测试和反序列化测试
Xson是一个Java对象序列化和反序列化程序。支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化。 Maven: <groupId>com.github.xsonorg</groupId> <artifactId>xson-core</artifactId> ...
在web开发中对象的序列化与反序列化经常使用,比较主流的有json格式与xml格式的序列化与反序列化,今天想写个jsop的小demo,结果发现不会使用php序列化,查了一下资料,做个笔记简单数组json格式序列化/反序列化 ...
/// Json序列化与反序列化方法封装类 /// </summary> public static class JsonConvert { /// /// 序列化模型对象为Json /// </summary> /// 模型类型</typeparam> /// 模型对象</param> /// <returns></...