利用序列化和反序列化来实现对象的深拷贝
对象的深拷贝一般有三种:
1、在构造方法阶段深拷贝:对每个属性创建相同的字面量
2、实现Cloneable接口,告诉JVM这是一个可以拷贝的类,并重写Object.clone()方法,实现对引用对象深度遍历拷贝
3、就是通过序列化和反序列化的方式
import java.io.Serializable; public class Address implements Serializable { String address; public Address(String address) { this.address = address; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
import java.io.*; public class User implements Serializable { String name; Address address; public User(String name, Address address) { this.name = name; this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } // 实际的数据流向:ObjectOutputStream->ByteArrayOutputStream->ByteArrayInputStream ->ObjectInputStream,深度复制从序列化对象又转为序列化对象 public User copy() throws IOException, ClassNotFoundException { // 序列化 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); objectOutputStream.writeObject(this); // 将this对象 转变为 二进制字节流 // 反序列化 ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream); return (User) objectInputStream.readObject(); } }
import java.io.IOException; public class TestDeepCopy { public static void main(String[] args) throws IOException, ClassNotFoundException { User u1 = new User("Liu Haoran", new Address("Henan Province")); User u2 = u1.copy(); System.out.println(u1 == u2); // u1和u2在Java堆中的地址不同 // 但是二者的属性的字面量是相同的 System.out.println("u1:" + u1.getName() + " " + u1.getAddress().getAddress()); System.out.println("u2:" + u2.getName() + " " + u2.getAddress().getAddress()); } }
作者:Ryanjie
出处:http://www.cnblogs.com/ryanjan/
本文版权归作者和博客园所有,欢迎转载。转载请在留言板处留言给我,且在文章标明原文链接,谢谢!
如果您觉得本篇博文对您有所收获,觉得我还算用心,请点击右下角的 [推荐],谢谢!