利用序列化与反序列化对Java对象进行深度复制
来源 http://lhg803.iteye.com/blog/407270
JDK的API中的java.lang.Object和Cloneable接口要完美实现深度clone时,都需要针对具体的类改代码。
采用序列化与反序列化可以完全独立于具体的某个类进行深度复制。
采用此方法做深度拷贝时,要求所有对象implements Serializable,否则报java.io.NotSerializableException异常。
实例:
学生类
package cup1; import java.io.Serializable; public class Student implements Serializable{private String name;private String tel;private int age; public String getName() {return name; }public void setName(String name) {this.name = name; }public String getTel() {return tel; }public void setTel(String tel) {this.tel = tel; }public int getAge() {return age; }public void setAge(int age) {this.age = age; } }
教师类,包括一个学生对象列表
package cup1; import java.io.Serializable;import java.util.List; public class Teacher implements Serializable{private String name;private int age;private List<Student> stuList; public String getName() {return name; }public void setName(String name) {this.name = name; }public int getAge() {return age; }public void setAge(int age) {this.age = age; }public List<Student> getStuList() {return stuList; }public void setStuList(List<Student> stuList) {this.stuList = stuList; } }
测试类,包括main方法和deepClone对象深度克隆方法
package cup1; import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.util.ArrayList;import java.util.List; public class Test { public static void main(String[] args) { Student s1 = new Student(); s1.setName("Wang"); s1.setAge(25); s1.setTel("110"); Student s2 = new Student(); s2.setName("Li"); s2.setAge(35); s2.setTel("119"); Teacher t = new Teacher(); t.setName("Zhang"); t.setAge(50); List<Student> stuList = new ArrayList<Student>(); stuList.add(s1); stuList.add(s2); t.setStuList(stuList); System.out.println("-------original-------"); System.out.println("t: " + t); System.out.println("s1: " + s1); System.out.println("s2: " + s2); System.out.println("-------after clone-------"); Teacher t2 = (Teacher) deepClone(t); System.out.println("t2: " + t2); System.out.println("t: " + t); Student s3 = t2.getStuList().get(0); Student s4 = t2.getStuList().get(1); System.out.println("s3: " + s3); System.out.println("s1: " + s1); System.out.println("s4: " + s4); System.out.println("s2: " + s2); System.out.println("-------after t2 change-------"); t2.setAge(55); t2.setName("Zhao"); System.out.println("t2 Name: " + t2.getName() + " t2 age" + t2.getAge()); System.out.println("t Name: " + t.getName() + " t age" + t.getAge()); } public static Object deepClone(Object src) { Object dst = null; try { ByteArrayOutputStream out = new ByteArrayOutputStream(); ObjectOutputStream oo = new ObjectOutputStream(out); oo.writeObject(src); ByteArrayInputStream in = new ByteArrayInputStream( out.toByteArray()); ObjectInputStream oi = new ObjectInputStream(in); dst = oi.readObject(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return dst; }}
输出结果
-------original-------t: cup1.Teacher@1fb8ee3s1: cup1.Student@61de33s2: cup1.Student@14318bb-------after clone-------t2: cup1.Teacher@12ac982t: cup1.Teacher@1fb8ee3s3: cup1.Student@1389e4s1: cup1.Student@61de33s4: cup1.Student@c20e24s2: cup1.Student@14318bb-------after t2 change-------t2 Name: Zhao t2 age55t Name: Zhang t age50
转载于:https://www.cnblogs.com/smartdog/archive/2011/11/03/2234832.html
利用序列化与反序列化对Java对象进行深度复制相关推荐
- Java对象序列化详解6,Java对象的序列化与反序列化详解
把对象转换为字节序列的过程称为对象的序列化,把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种途径: Ⅰ . 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中 Ⅱ. 在网 ...
- 对象的深度复制和浅复制 (深度拷贝和浅拷贝)
对象的深度复制和浅复制 (深度拷贝和浅拷贝) 作者:邓家海 时间:2018年2月11日 21:46:22 我们在实际的开发项目里面为了使得开发更加的便捷和方便,总会不经意的使用一些第三方的持久化框架( ...
- java反序列化多个对象_java 序列化与反序列化多个对象 抛出异常
jdk 1.8 IEDA 设置可以追加写入后,向目标文件序列化多个同一对象,再序列化出来时,因为反序列化时头部信息只读取一次,报出异常. 请问该怎么解决?或者代码写的有问题? import java. ...
- java对象序列化存储到文件、从文件中反序列化读取java对象
1.首先,对即将要操作的java对象的类需要实现序列化接口Serializable,代码如下: import java.io.Serializable; public class User imple ...
- digester java_利用Digester把XML转换为Java对象
在一个比较完整的应用系统里,经常需要有一些配置文件.简单的属性使用.properties文件即可,但要配置一些复杂对象,则应该考虑使用xml文件.一般用来读取xml文件的工具包有DOM.SAX和JDO ...
- Java对象的快速复制的几种方式
浅拷贝.深度复制.BeanUtils.copyProperties() 对象的克隆是指创建一个新的对象,且新的对象的状态与原始对象的状态相同.当对克隆的新对象进行修改时,不会影响原始对象的状态. 注释 ...
- java map 的复制,Java Map的深度复制和浅复制
来看一段代码,猜一下运行结果! //给 list 放入 2个map对象 Listlist = new ArrayList(); Map map1 = new HashMap(); map1.put(& ...
- 自定义序列化和反序列化的java实现
2019独角兽企业重金招聘Python工程师标准>>> package j2se.IO;import java.io.*;/*** Created by jingqing.zhou ...
- 第二十五题:二叉树的序列化和反序列化(Java)
题目要求: 二叉树的数的序列化和反序列话,二叉树实际是存储在内存中的,一旦断电或者是关机,二叉树的数据就会在内存中丢失.所以我们需要将二叉树的数据保存下来,这个过程叫做持久化或者序列化:将二叉树的数据 ...
最新文章
- 万物皆可embedding,AI 应用神器 Milvus 登顶数据库顶会 SIGMOD
- IDC:2018年中国制造业十大预测
- android调用webservice传参数,android调用webservice接口获取信息
- C语言十六进制转八进制(附完整源码)
- Echo Socket例子项目
- C# Lambda表达式 基础
- python flask跨域_Flask配置Cors跨域的实现
- 拒绝职场危机,程序员最核心的竞争力是什么?
- sip协议的超时机制
- 如何修改论文,能够避开查重?
- python函数手册 stata_Eviews、Stata、Python描述性分析教程汇总
- 三相PWM整流器dq解耦控制
- 马斯洛人类需求金字塔理论
- python 裁判文书网_中国裁判文书网 爬虫求助
- 2020京东双十一【全民营业,瓜分十亿】自动做任务软件
- adb的问题“No command ‘adb’ found, did you mean:”
- 前端优化——前端面试
- AndroidIos打包
- 【转】国人须知道的76个常识
- 图论学习NO2.图论相关内容了解
热门文章
- python读取excelsheet-python读取excel文件中所有sheet表格
- python的工作方向-Python最有发展潜力的方向已出来,是否有你喜欢的职位?
- python中国大学排名爬虫写明详细步骤-python爬虫爬取2020年中国大学排名
- python 3读取文件-python3的txt文件读写
- python好吗-自学python好吗?跟培训比那个好?
- python表白-教你如何用Python表白
- python如何爬虫-Python爬虫具体应该怎么使用?
- 用python画猫咪怎么画-Turtle库画小猫咪
- python爬虫正则表达式实例-python爬虫学习三:python正则表达式
- python好学吗mooc中文网-Python全栈工程师