`
qhhhn
  • 浏览: 33356 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

对象深度拷贝

阅读更多
利用序列化与反序列化对对象进行深度复制

public class Student implements Serializable {

	private String name;
	private String tel;
	private int age;
	
	//set and get.....
}

public class Teacher implements Serializable {

	private String name;
	private int age;
	private List<Student> stuList;

	//set and get....

}

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("t: "+t);
		System.out.println("s1: "+s1);
		System.out.println("s2: "+s2);
		System.out.println("after clone--------------");
		Teacher t2 = (Teacher) depthClone(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 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());

	}
	
	private static Object depthClone(Object srcObj){
		Object cloneObj = null;
		try {
			ByteArrayOutputStream out = new ByteArrayOutputStream();
			ObjectOutputStream oo = new ObjectOutputStream(out);
			oo.writeObject(srcObj);
			
			ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
			ObjectInputStream oi = new ObjectInputStream(in);
			cloneObj = oi.readObject();			
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return cloneObj;
	}

}


输入结果:
t: jame.jsp.bean.Teacher@affc70
s1: jame.jsp.bean.Student@1e63e3d
s2: jame.jsp.bean.Student@1004901
after clone--------------
t2: jame.jsp.bean.Teacher@1f14ceb
t: jame.jsp.bean.Teacher@affc70
s3: jame.jsp.bean.Student@f0eed6
s1: jame.jsp.bean.Student@1e63e3d
s4: jame.jsp.bean.Student@1d05c81
s2: jame.jsp.bean.Student@1004901
after change--------------
t2 Name: Zhao t2 age55
t Name: Zhang t age50

*采用些方法做深度拷贝时,要求所有对象implements Serializable,否则报java.io.NotSerializableException异常。
分享到:
评论

相关推荐

    C# Lambda快速深度拷贝

    今天上班在班车上和一个同事讨论有关C#拷贝效率的问题,聊到了多种深度拷贝方法,...于是办公室开始写Demo,经过多次修改发现是可以实现嵌套对象深度拷贝的,把实验结果写出来跟大家分享,顺便告诉那位同事问题解决了。

    浅谈C#中ListT对象的深度拷贝问题

    一、List对象中的T是值类型的情况(int 类型等) 对于值类型的List直接用以下方法就可以复制: List&lt;T&gt; oldList = new List(); oldList.Add(..); List&lt;T&gt; newList = new List(oldList); 二、List对象中的T是引用...

    浅谈C#中List&lt;T&gt;对象的深度拷贝问题

    深度拷贝是指创建一个新对象,不仅复制原始对象的属性,还复制了嵌套对象的引用,确保新旧对象之间的独立性。本文将探讨C#中List对象的深度拷贝问题。 首先,我们来看当List中的T是值类型,如int、double等时的情况...

    java 深度拷贝 复制 深度复制.zip

    在Java编程中,深度拷贝和浅拷贝是两种重要的对象复制方式,它们涉及到对象的内存管理和内存结构的复制。本篇文章将详细讲解如何利用Java的反射机制实现深度拷贝,以及这种方式的优点和注意事项。 首先,理解深度...

    C#深度拷贝克隆源码

    在编程领域,特别是使用.NET框架的C#语言中,"深度拷贝"是一个重要的概念,主要涉及对象复制。本文将详细解析"深度拷贝"的概念、实现方式以及如何在C#中实现一个自定义类的深度拷贝。 深度拷贝是指创建一个新对象,...

    java反射机制创建对象实现:java 深度拷贝 -超完美

    深度拷贝是指创建一个与原对象完全独立的新对象,包括所有嵌套对象的副本。以下将详细解释如何通过反射和序列化来实现这一目标。 首先,我们需要确保待拷贝的对象是可序列化的,因为Java的序列化机制可以用来实现...

    怎么使用javascript深度拷贝一个数组

    2. 使用Lodash库的`_.cloneDeep`方法:Lodash是一个广泛使用的JavaScript实用工具库,提供了许多便捷的工具函数,其中`_.cloneDeep`能够实现数组和对象的深度拷贝,包括循环引用的情况,是处理复杂数据结构拷贝的...

    C#基于表达式(Expression)实现对象深拷贝

    总的来说,通过C#的表达式树实现对象深拷贝提供了一种灵活且高效的方式,尤其适用于那些需要高性能和深度定制拷贝逻辑的场景。但是,也需要根据实际需求权衡其复杂性和适用性。在学习和使用过程中,可以结合提供的`...

    json-lib JsonUtils 工具类,json-lib 工具类

    4. **JSON对象深度拷贝**: 如果你需要对JSON对象进行深度复制,避免对原对象的修改影响到其他地方,可以使用`JsonUtils.clone(Object obj)` 方法。 5. **处理JSON与XML的互换**: `json-lib`还支持JSON与XML的...

    js代码-深度/广度优先遍历实现对象的深度拷贝

    在JavaScript中,深度拷贝是一种创建新对象的方法,该新对象与原始对象具有相同属性和值,但不共享引用。这在处理复杂的数据结构时尤其重要,因为浅拷贝只会复制对象的引用,而深度拷贝会递归地复制整个对象层次。本...

    Backbone.js的一些使用技巧

    1. **对象深度拷贝**:由于JavaScript的引用特性,当你从模型中获取一个包含嵌套对象的属性时,获取的是该对象的引用,而不是副本。这意味着对这个对象的任何修改会影响到原始模型中的数据。例如,在上述例子中,`...

    MyBatisDemo && JAVA把一个对象的全部属性复制到另一个相同的对象

    这篇博文“MyBatisDemo && JAVA把一个对象的全部属性复制到另一个相同的对象”探讨的是如何在Java编程中实现对象属性的深度复制。MyBatis是一个流行的Java持久层框架,它简化了数据库操作,而对象复制则是处理业务...

    深度探索C++对象模型 PDF

    《深度探索C++对象模型》是一本专门为C++程序员量身打造的专业书籍,它深入剖析了C++语言的核心——对象模型。这本书旨在帮助开发者更好地理解C++中的内存管理、类型系统、类层次结构以及对象生命周期等关键概念。...

    java不同对象及集合的多次复制

    - **Dozer库**:允许使用注解来定义复制规则,支持深度复制和类型转换,可以实现不同对象间的复制。 - **ModelMapper库**:提供了`ModelMapper`类,可以通过配置注解自动映射对象,简化了复制过程。 4. **集合与...

    深度探索c++对象模型(2012版本)

    此外,拷贝构造函数和赋值运算符也至关重要,它们处理对象的复制和赋值,确保数据的正确处理。 在C++中,类是定义对象的蓝图,而对象是类的实例。每个类可以有成员变量和成员函数,其中成员函数(方法)负责对象的...

    JS深度拷贝Object Array实例分析

    深度拷贝与浅拷贝是相对的概念,浅拷贝仅复制引用值的第一层,如果对象属性是引用类型,复制后的对象属性仍然指向原始数据的引用,因此对任何一个对象的修改都会影响到另一个。而深度拷贝则是递归复制原对象的所有...

    java对象复制克隆

    标签中的“复制java对象”、“深度克隆”和“深度复制实例”强调了我们要关注的是Java中如何实现对象的深拷贝,并提供了实际操作的例子。在编写代码时,应该遵循良好的编程实践,包括适当的命名、注释和错误处理,以...

    深度探索C++对象模型(侯捷 著)

    4. 构造、析构和拷贝的语义:涉及对象的创建、销毁和拷贝时编译器执行的具体操作。 5. 运行时语义:对象在程序执行阶段的行为,包括虚函数调用、动态绑定等。 此外,本书还涉及了COM(Component Object Model)的...

    Go 语言对象深拷贝方式性能分析

    深度拷贝可以通过序列化和反序列化来实现,也可以基于reflect包的反射机制完成。我对于这两种方式实现深拷贝做了性能基准测试。 下面是对比反射(github.com/mohae/deepcopy)与序列化(gob)所用的基准测试脚本 ...

Global site tag (gtag.js) - Google Analytics