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

public class Person implements Externalizable {

   
private String name = null;

   
transient private Integer age = null;

   
private Gender gender = null;

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

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

   
private void writeObject(ObjectOutputStream out) throws IOException {
        out.defaultWriteObject();
        out.writeInt(age);
    }

   
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        in.defaultReadObject();
        age 
= in.readInt();
    }

    @Override
   
public void writeExternal(ObjectOutput out) throws IOException {
        out.writeObject(name);
        out.writeInt(age);
    }

    @Override
   
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        name 
= (String) in.readObject();
        age 
= in.readInt();
    }
   
}

执行SimpleSerial之后会有如下结果:

arg constructor
none
-arg constructor
[John, 
31null]


5.4 readResolve()方法

    当我们使用Singleton模式时,应该是期望某个类的实例应该是唯一的,但如果该类是可序列化的,那么情况可能会略有不同。此时对第2节使用的Person类进行修改,使其实现Singleton模式,如下所示:

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;
    }
   
}

同时要修改SimpleSerial应用,使得能够保存/获取上述单例对象,并进行对象相等性比较,如下代码所示:

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

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