1:使用序列化
1)被序列化的对象实现Serializable接口(arraylist实现了这个接口)
package com.chinachche.datacorrection.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class DataUtil { /** * 深度复制 */ public static Serializable deeplyCopy(Serializable src) { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(src); oos.close(); baos.close(); byte[] data = baos.toByteArray(); ByteArrayInputStream bais = new ByteArrayInputStream(data); ObjectInputStream ois = new ObjectInputStream(bais); Serializable copy = (Serializable) ois.readObject(); ois.close(); bais.close(); return copy; } catch (Exception e) { e.printStackTrace(); } return null; } }
报 java.io.StreamCorruptedException: invalid stream header: EFBFBDEF
http://tristan1.iteye.com/blog/752895
http://blog.csdn.net/wangwenjunsw/article/details/5550441
2:克隆(复杂问题解决困难)
1). 在类的声明中加入“ implements Cloneable ”,标志该类有克隆功能;
2). 重载类 Object 的 clone() 方法,在该方法中调用 super.clone() :
3)类中包含其它对象的,其它对象的类也须要声明为Cloneable
package com.chinachche.datacorrection.util; public class cloneBeanA implements Cloneable {//实现接口 private String userName; private Friend friend; //对象类型变量 public Object clone() { try { cloneBeanA b = (cloneBeanA) super.clone(); b.friend = (Friend) friend.clone();//克隆对象类型数据 return b; } catch (CloneNotSupportedException e) { e.printStackTrace(); } return null; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public Friend getFriend() { return friend; } public void setFriend(Friend friend) { this.friend = friend; } }
package com.chinachche.datacorrection.util; public class Friend implements Cloneable {//实现接口 private String friendName; public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return null; } public String getFriendName() { return friendName; } public void setFriendName(String friendName) { this.friendName = friendName; } }
测试代码:
package com.chinachche.datacorrection.util; import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; public class testClone { Friend f1 = new Friend(); @Before public void Init() { f1.setFriendName("zhang san"); } @Test public void testClones() { cloneBeanA a = new cloneBeanA(); a.setUserName("gbz"); a.setFriend(f1); cloneBeanA b = (cloneBeanA) a.clone(); b.setUserName("123"); f1.setFriendName("456"); assertEquals("456", a.getFriend().getFriendName()); assertEquals("zhang san", b.getFriend().getFriendName()); } }
关于克隆的详解:http://www.iteye.com/topic/428920
相关推荐
deeplyAssign 将所有可枚举的属性和符号属性的值从一个或多个源对象深度复制到目标对象。它将返回目标对象。使用TypeScript编写。
我想实现了深度复制呢,也就是我新复制出来的对象不是仅仅复制引用, 而是复制对象!比如说,你需要在一个模板的基础上修改出5个版本的建立,每个版本投递到不同的企业上,版本1投给公司A,版本2投给公司B,。。。...
深度复制,赋值后给新对象赋值不会影响原始对象。
深度复制Java对象实例,复制后对象属性值改变不影响被复制对象,有注释
List的深度复制 浅谈C#中List<T>对象的深度拷贝问题
java反射机制创建对象实现:java 深度拷贝 -超完美,只使反射机制,不使用其它封装好的深度拷贝的工具类
利用泛型缓存机制;支持对象、集合映射;支持对象深度复制;
一、List对象中的T是值类型的情况(int 类型等)...1、对于引用类型的List无法用以上方法进行复制,只会复制List中对象的引用,可以用以下扩展方法复制: static class Extensions { public static IList<T> Clone(t
5.3 对象复制语意学(Object Copy Semantics) 5.4 对象的功能(Object Efficiency) 5.5 解构语意学(Semantics of Destruction) 第6章 执行期语意学(Runting Semantics) 6.1 对象的构造和解构(Object ...
5.3 对象复制语意学(Object Copy Semantics) 5.4 对象的功能(Object Efficiency) 5.5 解构语意学(Semantics of Destruction) 第6章 执行期语意学(Runting Semantics) 6.1 对象的构造和解构(Object ...
js克隆使用深度复制的Javascript对象复制用法var deepClone = require ( './js-clone/index.js' ) ;var object = { name : 'Kator James' , work : { companyName : 'LogicalAddress Ltd' , getCompanyName : ...
通过挨个罗列的方式一次复制子对象是非常耗费人力的,如果子对象是引用类型,则还要需要考虑是否对子对象进一步深拷贝。 实际应用中,一个类如果有几十个子对象,挨个复制对于开发人员来说索然无味比较费时费力。 ...
DeepCopy简单高效的库,用于深度复制.NET对象。此博客文章中描述:https://reubenbond.github.io/posts/codegen-2-il-boogaloo安装:通过NuGet安装:PM> Install-Package D DeepCopy Simple用于深度复制.NET对象的...
今天整理了下资料,分析下为什么一句话可以实现纯数据json对象的深度克隆,感兴趣的朋友可以了解下哦
对象复制工具,基于cglib BeanCopier 实现对实体对象、持久化对象、代理对象的克隆和复制, 避免重复克隆和复制,避免无限循环引用,(校验hashCode) 可指定实体对象和集合属性的克隆深度
PHP5中的对象模型通过引用来调用对象, 但有时你可能想建立一个对象的副本,并希望原来的对象的改变不影响到副本 . 为了这样的目的,PHP定义了一个特殊的方法,称为__clone. 像__construct和__destruct一样,前面有...
下面小编就为大家带来一篇浅谈C#中List对象的深度拷贝问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
深度复制所有JavaScript对象深度克隆器是: 快速–在普通基准速度测试中排名很高 紧凑–约5k(最小) 强大–正确处理所有标准JavaScript数据类型以及自定义类型 安装 $ npm install deep-copy-all 用法 Node.js ...
一种深度复制对象的方法 注意:您的项目必须有babel支持。 安装 $ npm i --save js-copy 用 import copy from 'js-copy'; let sourceObj = {}; let duplicateObj = copy(sourceObj);