‍        我们可以利用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. 虽未达到科幻中的未来,人工智能革命仍已到来
  2. day21IO流+FIle递归
  3. 《Xcode实战开发》——2.8节调试区域
  4. java的知识点15——String基础、String类和常量池、String类常用的方法、字符串相等的判断、组合模式
  5. PCA方法对特征降维
  6. wince 6.0 嵌入式开发指导
  7. 关于 SAP Spartacus UI 框架选型问题
  8. 扫地机器人湿地_什么品牌的扫地机器人性价比最高?
  9. Android设计模式之——观察者模式
  10. 服务端高并发分布式架构演进之路(转载,图画的好)
  11. 1.9编程基础之顺序查找 05 最大值和最小值的差
  12. vsto mysql_16-Python MySQL
  13. 前端-chromeF12 谷歌开发者工具详解 Network篇
  14. CCF201509-1 数列分段(100分)
  15. lede usb启动_OpenWrt LEDE 自动挂载USB U盘的方法
  16. 科海思苯酚吸附树脂ADS600详情 参数
  17. 流程管理——免费BPM软件
  18. ​云队友丨两次疫情冲击,却两次成功上市,携程是怎么做到的?
  19. Dynamics CRM 审批流引擎
  20. 【计算机三级信息安全】访问控制模型

热门文章

  1. html js点击字图片下拉,JavaScript实现文字与图片拖拽效果的方法
  2. Angular使用总结 --- 如何正确的操作DOM
  3. (网页)js每隔5分钟执行一次ajax请求的实现方法(转)
  4. vue组件详解(一)——组件与复用
  5. 巧用CSS实现分隔线
  6. 文件指针创建失败!File *fp失败
  7. Xcode 升级后,常常遇到的遇到的警告、错误,解决方法(转)
  8. bzoj2287【POJ Challenge】消失之物 缺一01背包
  9. Vs Code 配置C/C++ 开发环境
  10. BZOJ1734: [Usaco2005 Feb]Aggressive cows 愤怒的牛