java(20)---克隆的第二种方式:串行化
来源:互联网 发布:mac未知来源 编辑:程序博客网 时间:2024/05/22 12:09
前面介绍的是通过实现Cloneable接口并重写Object类的clone()方法来实现克隆。
本节介绍的是通过实现Serializable接口,通过对象的序列化和反序列化实现克隆,即串行化方式实现克隆。
1、为什么需要使用串行化方式实现克隆?
如果引用类型里面还包含很多引用类型,此时使用clone方法就会很麻烦。
此时就需要使用序列化的方式来实现对象的深克隆。
2、串行化
将对象写到流里面的过程称之为串行化过程。
串行化Serilization,在java程序圈子,我们将java序列化的过程称之为“腌咸菜”或“冷冻”
并行化Deserialization,将java反序列化的过程即将对象从流中读出来的过程称之为"回鲜"或“解冻”
那么如何使用串行化来实现深克隆?
先将需要克隆的对象实现Serializable序列化接口
然后将需要克隆的对象写到流里
再从流里读出来,便可以重构对象
实现代码如下:
package com.cn.vo;import java.io.Serializable;/** * 教师实体类 * */public class TeacherVO implements Serializable {/** * */private static final long serialVersionUID = 8018746437851755106L;private String teacherName; //教师名称public String getTeacherName() {return teacherName;}public void setTeacherName(String teacherName) {this.teacherName = teacherName;}}
package com.cn.vo;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;/** * 学生实体类 * */public class Student2VO implements Serializable {/** * */private static final long serialVersionUID = 2206290029742876238L;private String studentName; //学生姓名private TeacherVO teacher; //所属教师public String getStudentName() {return studentName;}public void setStudentName(String studentName) {this.studentName = studentName;}public TeacherVO getTeacher() {return teacher;}public void setTeacher(TeacherVO teacher) {this.teacher = teacher;}/** * 深克隆方法 * @throws IOException * @throws ClassNotFoundException * */public Object deepClone() throws IOException, ClassNotFoundException{ByteArrayOutputStream bout=new ByteArrayOutputStream();ObjectOutputStream objectOutput=new ObjectOutputStream(bout);objectOutput.writeObject(this);ByteArrayInputStream binput=new ByteArrayInputStream(bout.toByteArray());ObjectInputStream objectInput=new ObjectInputStream(binput);return(objectInput.readObject());}}
测试
package com.cn.clone;import java.io.IOException;import com.cn.vo.Student2VO;import com.cn.vo.TeacherVO;public class Test2 {public static void main(String[] args) throws IOException, ClassNotFoundException {TeacherVO teacherVO=new TeacherVO();teacherVO.setTeacherName("lisi");Student2VO student2vo=new Student2VO();student2vo.setStudentName("zhangsan");student2vo.setTeacher(teacherVO);Student2VO student2vo2=(Student2VO) student2vo.deepClone();System.out.println(student2vo.getStudentName());System.out.println(student2vo2.getStudentName());teacherVO.setTeacherName("wangwu");System.out.println(student2vo.getStudentName()+"---"+student2vo.getTeacher().getTeacherName());System.out.println(student2vo2.getStudentName()+"---"+student2vo2.getTeacher().getTeacherName());}}
显示结果如下:
阅读全文
0 0
- java(20)---克隆的第二种方式:串行化
- 使用串行化来实现java对象的深克隆
- Java对象的序列化方式克隆
- Java的串行化
- java通过克隆的方式创建对象
- java对象的串行化
- Java的串行化问题
- Java 序列化方式实现深克隆
- java中对象的串行化和反串行化
- Java 创建多线程的第二种方式
- JS数组克隆的几种方式
- 几种EBS克隆的方式
- 数组克隆的两种方式
- 串行通讯的方式-20151031
- java中串行化的例子
- java中对象的串行化(Serialization)
- java中对象的串行化
- Java的串行化和transient关键字
- 学习笔记——12306 手动登录解析(1)
- 栈和队列
- 图形打印
- 4个我经常滥用的unix命令
- 国内Maven中央仓库推荐
- java(20)---克隆的第二种方式:串行化
- 24-Swap Nodes In Pairs
- 2017.11.1笔记
- 11.1机房小测-模拟·BFS·DP&容斥
- 2017ccpc 秦皇岛-A Balloon Robot
- 63-C语言异常处理
- idea的快捷键大全
- STM32(RFID)阶段一:添加串口USART2,修改中断接收协议
- 大数据(二十六)Hive【Hive 优化】