Serializable:writeReplace
来源:互联网 发布:131458com淘宝账号查询 编辑:程序博客网 时间:2024/05/16 09:38
如果一个序列化类中含有Object writeReplace()方法,那么实际序列化的对象将是作为writeReplace方法返回值的对象,而且序列化过程的依据是实际被序列化对象的序列化实现。
People定义了writeReplace方法,并且自定义了writeObject/readObject方法。
public class People implements Serializable{ /** * */ private static final long serialVersionUID = 2659082826995480601L; private int age; private String name; People(int age,String name) { this.age = age; this.name = name; } private void writeObject(ObjectOutputStream out) { System.out.println("是否调用了我?"); } private void readObject(ObjectInputStream in) { System.out.println("是否调用了我?"); } private Object writeReplace() { return new Kong("路人"); }}
作为People类writeReplace返回值的Kong对象
public class Kong implements Serializable{ /** * */ private static final long serialVersionUID = -7144694309484327560L; public String s; Kong(String s) { this.s = s; } private void writeObject(ObjectOutputStream out) throws IOException { out.defaultWriteObject(); System.out.println("出"); } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); System.out.println("入"); }}
测试程序:
@Test public void testOut03() throws FileNotFoundException, IOException { People p = new People(2,"小白"); ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:\\temp01.txt")); out.writeObject(p); out.flush(); out.close(); } @Test public void testIn03() throws FileNotFoundException, IOException, ClassNotFoundException { ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:\\temp01.txt")); Kong k = (Kong)in.readObject(); in.close(); System.out.println(k.s); }
可以看到out.writeObject(p);试图序列化一个People对象,但是由于writeReplace方法的存在,实际上序列化了一个Kong 对象,在这个过程中调用了Kong定义的writeObject方法,并且在反序列化过程中,得到了一个Kong对象,并且调用了Kong定义的readObject方法。整个过程与People的writeObject/readObject无关。
这也就是说Kong k = (Kong)in.readObject();这个过程会依赖in中的实际对象,而不是依赖out.writeObject(p);
不知道为什么,就是这么个实现。
0 0
- Serializable:writeReplace
- Serializable
- Serializable
- Serializable
- Serializable
- Serializable
- Serializable
- Serializable
- Serializable
- serializable
- Serializable
- Serializable
- Serializable
- Serializable
- Serializable
- Serializable
- Serializable
- Serializable
- TOJ 4118 IQ test
- 【Spark】Spark基本概念
- 黑马程序员——GUI图形用户界面-整理笔记
- listview中的控件点击
- 使用maven的tomcat:run进行web项目热部署
- Serializable:writeReplace
- 【Spark】弹性分布式数据集RDD概述
- Oracle成长点点滴滴(3)— 权限管理
- js性能调试
- MFC中控制ComboBox的下拉框高度
- SDN&NFV优化数据中心
- android通知扫描某个文件或者文件夹(图库及时更新图片)
- 每天一个linux命令(30): chown命令
- JS-JavaScript学习笔记(一)