使用串行化来实现java对象的深克隆
2017-07-16 17:14
567 查看
1、介绍
为了避免重写比较复杂对象的clone()方法, 来实现深度克隆的目的。可以使用串行化的方式将对象读到流中然后再读出。
把对象写到流里的过程是串行化(Serilization)过程,应当指出的是,写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。在Java语言里深复制一个对象,常常可以先使对象实现Serializable接口,然后把对象(实际上只是对象的一个拷贝)写到一个流里,再从流里读出来便可以重建对象。
这样做的前提是对象以及对象内部所有引用到的对象都是可串行化的。
2、例子
从运行结果可以看出学生1和学生2的Teacher 对象已经不再是同一个对象,从而实现了深拷贝的目的。
为了避免重写比较复杂对象的clone()方法, 来实现深度克隆的目的。可以使用串行化的方式将对象读到流中然后再读出。
把对象写到流里的过程是串行化(Serilization)过程,应当指出的是,写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。在Java语言里深复制一个对象,常常可以先使对象实现Serializable接口,然后把对象(实际上只是对象的一个拷贝)写到一个流里,再从流里读出来便可以重建对象。
这样做的前提是对象以及对象内部所有引用到的对象都是可串行化的。
2、例子
package deep; import java.io.Serializable; public class Teacher implements Serializable { String name; int age; public Teacher(String name, int age) { this.name = name; this.age = age; } }
package deep; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OptionalDataException; import java.io.Serializable; public class Student implements Serializable { String name;// 常量对象 int age; Teacher t;// 学生1和学生2的引用值都是一样的。 public Student(String name, int age, Teacher t) { this.name = name; this.age = age; this.t = t; } public Object deepClone() throws IOException, OptionalDataException, ClassNotFoundException { // 将对象写到流里 ByteArrayOutputStream bo = new ByteArrayOutputStream(); ObjectOutputStream oo = new ObjectOutputStream(bo); oo.writeObject(this); // 从流里读出来 ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray()); ObjectInputStream oi = new ObjectInputStream(bi); return (oi.readObject()); } }
package deep; import java.io.IOException; import java.io.OptionalDataException; public class MyMainTest { public static void main(String[] args) throws OptionalDataException, ClassNotFoundException, IOException { Teacher t = new Teacher("tangliang", 30); Student s1 = new Student("zhangsan", 18, t); Student s2 = (Student) s1.deepClone(); s2.t.name = "tony"; s2.t.age = 40; // 学生1的老师不改变 System.out.println("name=" + s1.t.name + "," + "age=" + s1.t.age); // name=tangliang,age=30 } }
从运行结果可以看出学生1和学生2的Teacher 对象已经不再是同一个对象,从而实现了深拷贝的目的。
相关文章推荐
- java使用serializable进行序列化与反序列化实现对象clone(克隆)
- Rational Functional Tester Proxy SDK 开发,第 2 部分: 使用 Proxy SDK 扩展 RFT 已支持 Java GUI 组件 Proxy 对象实现
- (JAVA子类引用指象父类引用)JAVA克隆对象,包括父类属性,无需实现序列化接口
- 序列化存取实现java对象深度克隆
- java使用序列化实现深克隆
- 关于一道J笔试或者机试题的Java实现:从键盘输入一串字符,翻转后输出(要求不使用string相关类即对象)
- 在asp.net2.0中使用串行化对象实现自定义配置
- 使用JAVA的串行化打造自己的“对象数据库”
- java 引用数据类型实现 对象的克隆
- Java集合对象的排序使用Collection.sort方法,先实现Comparable接口
- [编写高质量代码:改善java程序的151个建议]建议43 避免对象浅拷贝; 建议44:推荐使用序列化实现对象的深拷贝
- java 实现对象的克隆
- java提高篇(五)-----使用序列化实现对象的拷贝
- java使用序列化实现深克隆
- 使用CArchive实现对象的串行化保存
- 使用BlazeDS实现java与flex传对象时,RemoteClass中包含自己写的类,后台无法转换的问题
- java提高篇-----使用序列化实现对象的拷贝 (深拷贝)
- JAVA基础学习篇----对象串行化及Transient关键字的使用
- java提高篇(六)-----使用序列化实现对象的拷贝
- 关于一道J笔试或者机试题的Java实现:从键盘输入一串字符,翻转后输出(要求不使用string相关类即对象)