来源  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对象进行深度复制相关推荐

  1. Java对象序列化详解6,Java对象的序列化与反序列化详解

    把对象转换为字节序列的过程称为对象的序列化,把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种途径: Ⅰ . 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中 Ⅱ.  在网 ...

  2. 对象的深度复制和浅复制 (深度拷贝和浅拷贝)

    对象的深度复制和浅复制 (深度拷贝和浅拷贝) 作者:邓家海 时间:2018年2月11日 21:46:22 我们在实际的开发项目里面为了使得开发更加的便捷和方便,总会不经意的使用一些第三方的持久化框架( ...

  3. java反序列化多个对象_java 序列化与反序列化多个对象 抛出异常

    jdk 1.8 IEDA 设置可以追加写入后,向目标文件序列化多个同一对象,再序列化出来时,因为反序列化时头部信息只读取一次,报出异常. 请问该怎么解决?或者代码写的有问题? import java. ...

  4. java对象序列化存储到文件、从文件中反序列化读取java对象

    1.首先,对即将要操作的java对象的类需要实现序列化接口Serializable,代码如下: import java.io.Serializable; public class User imple ...

  5. digester java_利用Digester把XML转换为Java对象

    在一个比较完整的应用系统里,经常需要有一些配置文件.简单的属性使用.properties文件即可,但要配置一些复杂对象,则应该考虑使用xml文件.一般用来读取xml文件的工具包有DOM.SAX和JDO ...

  6. Java对象的快速复制的几种方式

    浅拷贝.深度复制.BeanUtils.copyProperties() 对象的克隆是指创建一个新的对象,且新的对象的状态与原始对象的状态相同.当对克隆的新对象进行修改时,不会影响原始对象的状态. 注释 ...

  7. java map 的复制,Java Map的深度复制和浅复制

    来看一段代码,猜一下运行结果! //给 list 放入 2个map对象 Listlist = new ArrayList(); Map map1 = new HashMap(); map1.put(& ...

  8. 自定义序列化和反序列化的java实现

    2019独角兽企业重金招聘Python工程师标准>>> package j2se.IO;import java.io.*;/*** Created by jingqing.zhou ...

  9. 第二十五题:二叉树的序列化和反序列化(Java)

    题目要求: 二叉树的数的序列化和反序列话,二叉树实际是存储在内存中的,一旦断电或者是关机,二叉树的数据就会在内存中丢失.所以我们需要将二叉树的数据保存下来,这个过程叫做持久化或者序列化:将二叉树的数据 ...

最新文章

  1. 万物皆可embedding,AI 应用神器 Milvus 登顶数据库顶会 SIGMOD
  2. IDC:2018年中国制造业十大预测
  3. android调用webservice传参数,android调用webservice接口获取信息
  4. C语言十六进制转八进制(附完整源码)
  5. Echo Socket例子项目
  6. C# Lambda表达式 基础
  7. python flask跨域_Flask配置Cors跨域的实现
  8. 拒绝职场危机,程序员最核心的竞争力是什么?
  9. sip协议的超时机制
  10. 如何修改论文,能够避开查重?
  11. python函数手册 stata_Eviews、Stata、Python描述性分析教程汇总
  12. 三相PWM整流器dq解耦控制
  13. 马斯洛人类需求金字塔理论
  14. python 裁判文书网_中国裁判文书网 爬虫求助
  15. 2020京东双十一【全民营业,瓜分十亿】自动做任务软件
  16. adb的问题“No command ‘adb’ found, did you mean:”
  17. 前端优化——前端面试
  18. AndroidIos打包
  19. 【转】国人须知道的76个常识
  20. 图论学习NO2.图论相关内容了解

热门文章

  1. python读取excelsheet-python读取excel文件中所有sheet表格
  2. python的工作方向-Python最有发展潜力的方向已出来,是否有你喜欢的职位?
  3. python中国大学排名爬虫写明详细步骤-python爬虫爬取2020年中国大学排名
  4. python 3读取文件-python3的txt文件读写
  5. python好吗-自学python好吗?跟培训比那个好?
  6. python表白-教你如何用Python表白
  7. python如何爬虫-Python爬虫具体应该怎么使用?
  8. 用python画猫咪怎么画-Turtle库画小猫咪
  9. python爬虫正则表达式实例-python爬虫学习三:python正则表达式
  10. python好学吗mooc中文网-Python全栈工程师