Java对象序列化深入理解(6)

public class SimpleSerial {

   
public static void main(String[] args) throws Exception {
        File file 
= new File("person.out");
        ObjectOutputStream oout 
= new ObjectOutputStream(new FileOutputStream(file));
        oout.writeObject(Person.getInstance()); 
// 保存单例对象
        oout.close();

        ObjectInputStream oin 
= new ObjectInputStream(new FileInputStream(file));
        Object newPerson 
= oin.readObject();
        oin.close();
        System.out.println(newPerson);

        System.out.println(Person.getInstance() 
== newPerson); // 将获取的对象与Person类中的单例对象进行相等性比较
    }
}

执行上述应用程序后会得到如下结果:

arg constructor
[John, 
31, MALE]
false

值得注意的是,从文件person.out中获取的Person对象与Person类中的单例对象并不相等。为了能在序列化过程仍能保持单例的特性,可以在Person类中添加一个readResolve()方法,在该方法中直接返回Person的单例对象,如下所示:

public class Person implements Serializable {

   
private static class InstanceHolder {
       
private static final Person instatnce = new Person("John"31, Gender.MALE);
    }

   
public static Person getInstance() {
       
return InstanceHolder.instatnce;
    }

   
private String name = null;

   
private Integer age = null;

   
private Gender gender = null;

   
private Person() {
        System.out.println(
"none-arg constructor");
    }

   
private Person(String name, Integer age, Gender gender) {
        System.out.println(
"arg constructor");
       
this.name = name;
       
this.age = age;
       
this.gender = gender;
    }

   
private Object readResolve() throws ObjectStreamException {
       
return InstanceHolder.instatnce;
    }
   
}

再次执行本节的SimpleSerial应用后将有如下输出:

arg constructor
[John, 
31, MALE]
true

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/91d3cded3bd2896734f77403b79c8111.html