版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yizhenn/article/details/72466430
我们知道,实现了序列化的类。在反序列化时,实例的创建是由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