‍        我们可以利用clone方法来实现对象只见的复制,但对于比较复杂的对象(比如对象中包含其他对象,其他对象又包含别的对象.....)这样我们必须进行层层深度clone,每个对象需要实现 cloneable接口,比较麻烦,那就继续学习下一个序列化方法。

创建

/*

* 文 件 名: A.java 版 权: Unis Cloud Information Technology Co., Ltd. Copyright

* 2015, All rights reserved 描 述:  修 改 人: Administrator 修改时间: 2015-11-10

* 跟踪单号:  修改单号:  修改内容:

*/

package com.hubin.supers;

import java.io.Serializable;

/**

*

*

* @author Administrator

* @version [版本号, 2015-11-10]

* @see [相关类/方法]

* @since [产品/模块版本]

*/

public class A implements Serializable {

private String name;

private int age;

/**

* @return 返回 name

*/

public String getName() {

return name;

}

/**

* @param 对name进行赋值

*/

public void setName(String name) {

this.name = name;

}

/**

* @return 返回 age

*/

public int getAge() {

return age;

}

/**

* @param 对age进行赋值

*/

public void setAge(int age) {

this.age = age;

}

/**

* @return

*/

@Override

public String toString() {

return "A [name=" + name + ", age=" + age + "]";

}

}

创建B类:

/*

* 文 件 名: B.java 版 权: Unis Cloud Information Technology Co., Ltd. Copyright

* 2015, All rights reserved 描 述:  修 改 人: Administrator 修改时间: 2015-11-10

* 跟踪单号:  修改单号:  修改内容:

*/

package com.hubin.supers;

import java.io.Serializable;

/**

*

*

* @author Administrator

* @version [版本号, 2015-11-10]

* @see [相关类/方法]

* @since [产品/模块版本]

*/

public class B implements Serializable {

private A a;

private String name;

/**

* @return 返回 a

*/

public A getA() {

return a;

}

/**

* @param 对a进行赋值

*/

public void setA(A a) {

this.a = a;

}

/**

* @return 返回 name

*/

public String getName() {

return name;

}

/**

* @param 对name进行赋值

*/

public void setName(String name) {

this.name = name;

}

/**

* @return

*/

@Override

public String toString() {

return "B [a=" + a + ", name=" + name + "]";

}

}

创建测试Desc类:

/*

* 文 件 名: Desc.java 版 权: Unis Cloud Information Technology Co., Ltd. Copyright

* 2015, All rights reserved 描 述:  修 改 人: Administrator 修改时间: 2015-11-10

* 跟踪单号:  修改单号:  修改内容:

*/

package com.hubin.supers;

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.util.ArrayList;

import java.util.List;

/**

*

* @author Administrator

* @version [版本号, 2015-11-10]

* @see [相关类/方法]

* @since [产品/模块版本]

*/

public class Desc {

public static void main(String[] args) throws Exception {

A a = new A();

a.setName("张三");

a.setAge(10);

B b = new B();

b.setA(a);

b.setName("南京");

List list = new ArrayList();

list.add(b);

ByteArrayOutputStream byteOut = new ByteArrayOutputStream();

ObjectOutputStream out = new ObjectOutputStream(byteOut);

out.writeObject(list);

ByteArrayInputStream byteIn = new ByteArrayInputStream(

byteOut.toByteArray());

ObjectInputStream in = new ObjectInputStream(byteIn);

List list1 = (List) in.readObject();

list1.get(0).getA().setName("李四");

System.out.println(list.get(0));

System.out.println(list1.get(0));

}

}

结果:

B [a=A [name=张三, age=10], name=南京]

B [a=A [name=李四, age=10], name=南京]

从结果可以看到当修改序列化后的对象的值不会影响原先对象的值,所以可以通过序列化进行深度克隆

java clone 序列化_关于Java对象深度Clone以及序列化与反序列化的使用相关推荐

  1. java 防止拷贝_[改善Java代码]避免对象的浅拷贝

    建议43: 避免对象的浅拷贝 我们知道一个类实现了Cloneable接口就表示它具备了被拷贝的能力,如果再覆写clone()方法就会完全具备拷贝能力.拷贝是在内存中进行的,所以在性能方面比直接通过ne ...

  2. java序列化_夯实Java基础系列22:一文读懂Java序列化和反序列化

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  3. java自定义类序列化_【java】面试官问我,如何实现一个自定义序列化

    通常离开内存的东西,如果需要存储或传输是需要序列化的,在java中要序列化是要实现Serializable的(或其子类),那不实现Serializable,如何实现一个自定义的序列化呢,我首先想到的是 ...

  4. java 共享软件 保护_【Java并发.3】对象的共享

    本章将介绍如何共享和发布对象,从而使他们能够安全地由多个线程同时访问.这两章合在一起就形成了构建线程安全类以及通过java.util.concurrent 类库来构建开发并发应用程序的重要基础. 3. ...

  5. java基础知识点_「Java面试题/知识点精华集」20000+字的Java基础知识篇(2020最新版) !

    " 本文已经收录进我的 79K Star 的 Java 开源项目 JavaGuide:https://github.com/Snailclimb/JavaGuide (「Java学习+面试指 ...

  6. java核心教程_核心Java教程

    java核心教程 Welcome to Core Java Tutorial. I have written a lot on Core Java and Java EE frameworks. Th ...

  7. java关键字整理_【java基础知识整理】java基础语法之关键字

    一.continue与break continue与break基本都使用与循环中,但是continue指结束所有循环的当前循环,而break是指结束整个循环.下面用代码进行简单实例. 使用contin ...

  8. java高级教程_高级Java教程

    java高级教程 课程大纲 学习Java基础很容易. 但是,真正钻研该语言并研究其更高级的概念和细微差别将使您成为一名出色的Java开发人员. 网络上充斥着"软","便宜 ...

  9. 纯java分布式内存数据库_最新Java岗面试清单:分布式+Dubbo+线程+Redis+数据库+JVM+并发...

    最近可能有点闲的慌,没事就去找面试面经,整理了一波面试题.我大概是分成了Java基础.中级.高级,分布式,Spring架构,多线程,网络,MySQL,Redis缓存,JVM相关,调优,设计模式,算法与 ...

最新文章

  1. NGTabBarController
  2. linux 在线帮助,linux获取在线帮助
  3. 推荐几十本投资书籍、互联网书籍及热门查看流量的工具
  4. Windows和Mac安装JDK及环境变量配置
  5. SpringMVC 的总结
  6. 蓝桥杯 算法训练 区间k大数查询(水题)
  7. 【转】移动Web开发-点击事件及页面滚动
  8. python绘制绝对值正弦曲线_Python图形绘制操作之正弦曲线实现方法分析
  9. c语言五子棋最简单的ai,C++简单五子棋的AI设计实现
  10. 软考 | 2019年上半年 软件设计师 下午试卷
  11. 让我们恭喜阿根廷队夺得大力神杯
  12. 二手车电商风波:改革路上,请给予一定的容错空间!
  13. 费舍尔方法(Fisher‘s method)的数学原理解释
  14. DES加密和解密算法
  15. jQuery简介-01
  16. C/C++编程 MP3等音频文件播放
  17. Android 动画(二) 实战演示——仿网易新闻安卓端菜单栏动画
  18. .net的域名是什么
  19. Core Bluetooth 使用教程
  20. hyperion epm主要模块介绍

热门文章

  1. WebUploader点击上传文件选择框会延迟几秒才会显示
  2. 【解决】ERROR in xxx.js from UglifyJs
  3. Socket.io 深入理解
  4. Axios 作弊表(Cheat Sheet)
  5. MySQL(介绍,安装,密码操作,权限表)
  6. 【转】 差分约束系统详解(转化为最短路) (概念)
  7. mysql慢查询工具
  8. 使用Gitolite搭建Gitserver
  9. 微软Team Foundation Service 的Scrum模板中的Feature和Backlog Items 的区别【转载】
  10. linux 命令案例学习——文件搜索