序列化代理模式

我们知道,实现了序列化的类。在反序列化时,实例的创建是由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");
    }
}

笔者开设了一个知乎live,详细的介绍的JAVA从入门到精通该如何学,学什么?

提供给想深入学习和提高JAVA能力的同学,欢迎收听https://www.zhihu.com/lives/932192204248682496



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值