如何通过序列化实现深拷贝
2013-05-26 14:54
513 查看
先说说Java的浅、深拷贝?
浅拷贝:只复制一个对象,对象内部存在的指向其他对象数组或者引用则不复制。
深拷贝:对象,对象内部的引用均复制。
java.lang.Object的clone()方法默认是返回一个浅拷贝对象。因此如果要用clone()方法实现一个深拷贝,我们必须对每个对象的clone()方法进行特别实现。当对象层次复杂的时候,这样做不但困难而且浪费时间和容易出现错误,特别有时候你不但需要深拷贝同时你也对这个对象进行浅拷贝的时候,你会发现写这个clone()方法真不是一个好的解决方案。
那么除了clone()方法,我们还可以怎么实现呢?答案是序列化,实现步骤和思路是把要拷贝的对象输出成byte array,然后再利用ObjectInputStream转换出新的对象。就可以完成深拷贝。
下面是实现代码:
//把对象先写到字节数组中,然后从字节数组中读对象。
public static Object copy(Object oldObj) {
Object obj =null;
try {
// Writethe object out to a byte array
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bos);
out.writeObject(oldObj);
out.flush();
out.close();
//Retrieve an input stream from the byte array and read
// acopy of the object back in.
ByteArrayInputStream bis = newByteArrayInputStream(bos.toByteArray());
ObjectInputStream in = new ObjectInputStream(bis);
obj =in.readObject();
} catch(IOException e) {
e.printStackTrace();
} catch(ClassNotFoundException cnfe) {
cnfe.printStackTrace();
}
returnobj;
}
浅拷贝:只复制一个对象,对象内部存在的指向其他对象数组或者引用则不复制。
深拷贝:对象,对象内部的引用均复制。
java.lang.Object的clone()方法默认是返回一个浅拷贝对象。因此如果要用clone()方法实现一个深拷贝,我们必须对每个对象的clone()方法进行特别实现。当对象层次复杂的时候,这样做不但困难而且浪费时间和容易出现错误,特别有时候你不但需要深拷贝同时你也对这个对象进行浅拷贝的时候,你会发现写这个clone()方法真不是一个好的解决方案。
那么除了clone()方法,我们还可以怎么实现呢?答案是序列化,实现步骤和思路是把要拷贝的对象输出成byte array,然后再利用ObjectInputStream转换出新的对象。就可以完成深拷贝。
下面是实现代码:
//把对象先写到字节数组中,然后从字节数组中读对象。
public static Object copy(Object oldObj) {
Object obj =null;
try {
// Writethe object out to a byte array
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bos);
out.writeObject(oldObj);
out.flush();
out.close();
//Retrieve an input stream from the byte array and read
// acopy of the object back in.
ByteArrayInputStream bis = newByteArrayInputStream(bos.toByteArray());
ObjectInputStream in = new ObjectInputStream(bis);
obj =in.readObject();
} catch(IOException e) {
e.printStackTrace();
} catch(ClassNotFoundException cnfe) {
cnfe.printStackTrace();
}
returnobj;
}
相关文章推荐
- 如何通过序列化实现深拷贝
- Java深拷贝除了通过实现Cloneable接口,另外还可以通过序列化实现对象的拷贝。
- C#通过序列化实现深拷贝
- 通过序列化实现深拷贝
- C#通过序列化实现深拷贝
- 通过序列化实现深拷贝
- 通过序列化实现深拷贝
- 通过序列化实现深拷贝
- C#通过序列化实现深拷贝
- 通过序列化 实现深拷贝
- 什么是java序列化,如何实现java序列化?
- 如何通过JQ,Ajax来实现返回到上一个页面并进行刷新
- 什么是java 序列化,如何实现java 序列化?
- 通过序列化和反序列化实现对象实例化
- 如何通过序列化在网络间传递对象,网络协议:轻松定义自己的网络通讯协议
- [原创]java WEB学习笔记55:Struts2学习之路---详解struts2 中 Action,如何访问web 资源,解耦方式(使用 ActionContext,实现 XxxAware 接口),耦合方式(通过ServletActionContext,通过实现 ServletRequestAware, ServletContextAware 等接口的方式)
- 如何通过单页实现类似iframe左右侧结构
- 什么是java序列化,如何实现java序列化?或请解释Serializable接口的作用
- c#中如何实现拷贝对象
- 如何通过Rancher webhook微服务实现Service/Host的弹性伸缩