序列化代理模式
来源:互联网 发布:专业中英文校对软件 编辑:程序博客网 时间: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"); }}
阅读全文
0 0
- 序列化代理模式
- 序列化代理模式
- 序列化及其代理
- Serializable:序列化代理
- 代理模式--动态代理
- 代理模式-静态代理
- 代理模式-静态代理
- 代理模式 & 动态代理
- 代理模式--静态代理
- 代理模式--动态代理
- 代理模式(动态代理)
- 代理模式-动态代理
- 代理模式-动态代理
- 代理模式动态代理
- 代理模式-静态代理
- 代理模式-动态代理
- 代理模式 -动态代理
- 代理模式---动态代理
- WKWebView9.0以下使用加载不出html
- 哈佛图书馆墙上的训言
- Linux下Make编译结果输出到文件
- android xml解析之XmlPullParser
- java实现线性链表
- 序列化代理模式
- Andorid view 绘制原理
- Linux下如何编译并运行C程序
- js中const,var,let区别
- JS那些事儿(3)-函数
- JAVA高级工程师课程笔记整理——(四)高级特性
- float和double
- SDWebImage 加载图片不显示问题 --- 难以想象的BUG
- 前端动画渲染引擎pixi.js系列(8)动画精灵AnimatedSprite实现逐帧动画效果