反序列化对象

来源:互联网 发布:阿里云 外高桥 机房 编辑:程序博客网 时间:2024/04/20 08:07


       下面程序为Singleton类提供了readResolve()方法,当JVM反序列化地恢复一个新对象时,系统会自动调用这个readResolve()方法返回指定好的对象,从而保证系统通过反序列化机制不会产生多个对象。运行下面程序,程序判断singleton == singleton2 是否相同将输出true,这表明反序列化机制恢复出来的Java对象依然是原来的Java对象。通过这种方式可保证反序列化时Singleton依然是单例类。




import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.ObjectStreamException;import java.io.Serializable;class Singleton implements Serializable {private static final long serialVersionUID = 327838450350496302L;private static Singleton instance;private String name;private Singleton(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}public static Singleton getInstance(String name) {if (instance == null) {instance = new Singleton(name);}return instance;}// 提供readResolve()方法private Object readResolve() throws ObjectStreamException {return instance;}}public class SingletonTest {public static void main(String[] args) throws Exception {// 调用静态方法来获取wolf实例Singleton singleton = Singleton.getInstance("NorhtWolf");System.out.println("Wolf对象创建完成~~~");Singleton singleton2 = null;ObjectOutputStream objectOutputStream = null;ObjectInputStream objectInputStream = null;try {// 创建对象输出流objectOutputStream = new ObjectOutputStream(new FileOutputStream("b.bin"));// 创建对象输入流objectInputStream = new ObjectInputStream(new FileInputStream("b.bin"));// 序列化输入Java对象objectOutputStream.writeObject(singleton);objectOutputStream.flush();// 反序列化恢复Java对象singleton2 = (Singleton) objectInputStream.readObject();System.out.println(singleton2.getName());// 两个对象的实例变量值完全相等System.out.println(singleton.equals(singleton2));// 两个对象不相同System.out.println(singleton == singleton2);} catch (Exception e) {} finally {if (objectOutputStream != null) {objectOutputStream.close();}if (objectInputStream != null) {objectInputStream.close();}}}}