序列化代理模式

来源:互联网 发布:专业中英文校对软件 编辑:程序博客网 时间:2024/05/22 12:07

我们知道,实现了序列化的类。在反序列化时,实例的创建是由readObject方法来完成的。由于这是一个不同于构造函数的创建类实例的通道,因此在构造函数中的状态约束条件在readObjetc中也得一条不落下的实现。这很让人头大,因此这里介绍一种模式,将实例的反序列化也交给改造函数来完成,即序列化代理模式。要想稳健的将带有重要约束条件的对象序列化时,这种模式可能是最容易的方法。代码如下:


import java.io.*;import java.util.EnumSet;/** * Created by xuyizhen on 2017/5/18. */public class Demo {    public static void main(String[] args) throws IOException, ClassNotFoundException {        Person person = new Person("E-臻", 12);        File file = new File("C:\\test.txt");        FileOutputStream fileOutputStream = new FileOutputStream(file);        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);        objectOutputStream.writeObject(person);        objectOutputStream.flush();        objectOutputStream.close();        fileOutputStream.close();        FileInputStream fileInputStream = new FileInputStream(file);        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);        Person person1 = (Person) objectInputStream.readObject();        objectInputStream.close();        fileInputStream.close();        System.out.println(person1);    }}final class Person implements Serializable {    private String name;    private int age;    public Person(String name, int age) {        this.name = name;        this.age = age;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    @Override    public String toString() {        return "Person{" +                "name='" + name + '\'' +                ", age=" + age +                '}';    }    private static class SerializationProxy implements Serializable {        private String name;        private int age;        public SerializationProxy(Person p) {            this.name = p.name;            this.age = p.age;        }        private Object readResolve() {            System.out.println("反序列化时使用的类");            return new Person(name, age);            //序列化代理模式的精髓,反序列化不再是通过不可控的readObject()途径,而是通过正常的构造函数途径。        }    }    private Object writeReplace() {        System.out.println("序列化时使用的类");        return new SerializationProxy(this);    }    private void readObject(java.io.ObjectInputStream in)            throws IOException, ClassNotFoundException {        throw new InvalidObjectException("proxy required");    }}


原创粉丝点击