一:背景
单例在序列化时,仅仅实现序列化接口(implements Serializable)是没有用的,它在反序列化时,会每次都去创建一个新的实例。
二:如何解决
声明所有的实例域都是瞬时的(transient) ,且提供一个readResolve()方法。
三:测试代码
package com.eden.coreLearn.javacore;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectStreamException;
import java.io.Serializable;
/**
* 类SingleClass.java的实现描述:TODO 类实现描述
*
* @author wangding_91@163.com 2016年3月15日 下午5:21:54
*/
public class SingleClass implements Serializable {
private String name = "dingwang";
/**
*
*/
private static final long serialVersionUID = -3019013760713539747L;
private static SingleClass instance = null;
private SingleClass() {
}
public static SingleClass getInstance() {
if (instance == null) {
instance = new SingleClass();
}
return instance;
}
public String getName() {
return name;
}
private Object readResolve() throws ObjectStreamException {
return instance;
}
public void setName(String name) {
this.name = name;
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
SingleClass single = SingleClass.getInstance();
System.out.println("hashCode1=" + single.hashCode());
File singleFile = new File("E:/single.txt");
if (!singleFile.exists()) {
singleFile.createNewFile();
}
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(singleFile));
oos.writeObject(single);
oos.close();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(singleFile));
Object obj = null;
while ((obj = ois.readObject()) != null) {
SingleClass s = (SingleClass) obj;
System.out.println("hashCode2=" + s.hashCode() + "===========" + s.getName());
}
ois.close();
}
}
四:运行结果
hashCode1=705927765
hashCode2=705927765===========dingwang