利用序列化与反序列化对对象进行深度复制
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#拷贝效率的问题,聊到了多种深度拷贝方法,...于是办公室开始写Demo,经过多次修改发现是可以实现嵌套对象深度拷贝的,把实验结果写出来跟大家分享,顺便告诉那位同事问题解决了。
一、List对象中的T是值类型的情况(int 类型等) 对于值类型的List直接用以下方法就可以复制: List<T> oldList = new List(); oldList.Add(..); List<T> newList = new List(oldList); 二、List对象中的T是引用...
深度拷贝是指创建一个新对象,不仅复制原始对象的属性,还复制了嵌套对象的引用,确保新旧对象之间的独立性。本文将探讨C#中List对象的深度拷贝问题。 首先,我们来看当List中的T是值类型,如int、double等时的情况...
在Java编程中,深度拷贝和浅拷贝是两种重要的对象复制方式,它们涉及到对象的内存管理和内存结构的复制。本篇文章将详细讲解如何利用Java的反射机制实现深度拷贝,以及这种方式的优点和注意事项。 首先,理解深度...
在编程领域,特别是使用.NET框架的C#语言中,"深度拷贝"是一个重要的概念,主要涉及对象复制。本文将详细解析"深度拷贝"的概念、实现方式以及如何在C#中实现一个自定义类的深度拷贝。 深度拷贝是指创建一个新对象,...
深度拷贝是指创建一个与原对象完全独立的新对象,包括所有嵌套对象的副本。以下将详细解释如何通过反射和序列化来实现这一目标。 首先,我们需要确保待拷贝的对象是可序列化的,因为Java的序列化机制可以用来实现...
2. 使用Lodash库的`_.cloneDeep`方法:Lodash是一个广泛使用的JavaScript实用工具库,提供了许多便捷的工具函数,其中`_.cloneDeep`能够实现数组和对象的深度拷贝,包括循环引用的情况,是处理复杂数据结构拷贝的...
总的来说,通过C#的表达式树实现对象深拷贝提供了一种灵活且高效的方式,尤其适用于那些需要高性能和深度定制拷贝逻辑的场景。但是,也需要根据实际需求权衡其复杂性和适用性。在学习和使用过程中,可以结合提供的`...
4. **JSON对象深度拷贝**: 如果你需要对JSON对象进行深度复制,避免对原对象的修改影响到其他地方,可以使用`JsonUtils.clone(Object obj)` 方法。 5. **处理JSON与XML的互换**: `json-lib`还支持JSON与XML的...
在JavaScript中,深度拷贝是一种创建新对象的方法,该新对象与原始对象具有相同属性和值,但不共享引用。这在处理复杂的数据结构时尤其重要,因为浅拷贝只会复制对象的引用,而深度拷贝会递归地复制整个对象层次。本...
1. **对象深度拷贝**:由于JavaScript的引用特性,当你从模型中获取一个包含嵌套对象的属性时,获取的是该对象的引用,而不是副本。这意味着对这个对象的任何修改会影响到原始模型中的数据。例如,在上述例子中,`...
这篇博文“MyBatisDemo && JAVA把一个对象的全部属性复制到另一个相同的对象”探讨的是如何在Java编程中实现对象属性的深度复制。MyBatis是一个流行的Java持久层框架,它简化了数据库操作,而对象复制则是处理业务...
《深度探索C++对象模型》是一本专门为C++程序员量身打造的专业书籍,它深入剖析了C++语言的核心——对象模型。这本书旨在帮助开发者更好地理解C++中的内存管理、类型系统、类层次结构以及对象生命周期等关键概念。...
- **Dozer库**:允许使用注解来定义复制规则,支持深度复制和类型转换,可以实现不同对象间的复制。 - **ModelMapper库**:提供了`ModelMapper`类,可以通过配置注解自动映射对象,简化了复制过程。 4. **集合与...
此外,拷贝构造函数和赋值运算符也至关重要,它们处理对象的复制和赋值,确保数据的正确处理。 在C++中,类是定义对象的蓝图,而对象是类的实例。每个类可以有成员变量和成员函数,其中成员函数(方法)负责对象的...
深度拷贝与浅拷贝是相对的概念,浅拷贝仅复制引用值的第一层,如果对象属性是引用类型,复制后的对象属性仍然指向原始数据的引用,因此对任何一个对象的修改都会影响到另一个。而深度拷贝则是递归复制原对象的所有...
标签中的“复制java对象”、“深度克隆”和“深度复制实例”强调了我们要关注的是Java中如何实现对象的深拷贝,并提供了实际操作的例子。在编写代码时,应该遵循良好的编程实践,包括适当的命名、注释和错误处理,以...
4. 构造、析构和拷贝的语义:涉及对象的创建、销毁和拷贝时编译器执行的具体操作。 5. 运行时语义:对象在程序执行阶段的行为,包括虚函数调用、动态绑定等。 此外,本书还涉及了COM(Component Object Model)的...
深度拷贝可以通过序列化和反序列化来实现,也可以基于reflect包的反射机制完成。我对于这两种方式实现深拷贝做了性能基准测试。 下面是对比反射(github.com/mohae/deepcopy)与序列化(gob)所用的基准测试脚本 ...