java 序列化实现对象的深拷贝
2016-06-20 11:35
579 查看
写java代码时,经常要实现对象的clone方法,处理对象的深拷贝问题。有一种简单的实现对象深拷贝的方法:将对象写入到字节流中,再读出来即可实现深拷贝。
@SuppressWarnings("unchecked")
public static <T extends Serializable> T clone(T obj) {
T cloneObj = null;
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ois = new ObjectInputStream(bais);
cloneObj = (T) ois.readObject();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (oos != null) {
try {
oos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (ois != null) {
try {
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
return cloneObj;
}
执行此方法需要注意:
对象需要实现Serializable接口
对象内部的属性均可序列化
注意方法和属性的特殊修饰符。比如final、static变量的序列化问题会被引入到对象拷贝中。transient变量不会序列化。
@SuppressWarnings("unchecked")
public static <T extends Serializable> T clone(T obj) {
T cloneObj = null;
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ois = new ObjectInputStream(bais);
cloneObj = (T) ois.readObject();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (oos != null) {
try {
oos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (ois != null) {
try {
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
return cloneObj;
}
执行此方法需要注意:
对象需要实现Serializable接口
对象内部的属性均可序列化
注意方法和属性的特殊修饰符。比如final、static变量的序列化问题会被引入到对象拷贝中。transient变量不会序列化。
相关文章推荐
- Java中Vector和ArrayList的区别
- PowerDesigner实现版本控制,多人协作
- eclipse 安装 fatjar 插件
- Java - PAT - 1026. 程序运行时间(15)
- 2016.6.20笔记(2)-多线程(3)
- JavaSE学习53:细说多线程之内存可见性
- Java命令参数 -D -classpath
- 【深入理解Java虚拟机JVM】java如何实现跨平台
- java基础学习
- java.lang.NoSuchFieldError 异常原因
- String类为什么是final的?
- eclipse插件
- Java多线程实现的三种方式
- [置顶] Java并发编程与技术内幕:ThreadFactory、ThreadLocal
- 史上最全最强SpringMVC详细示例实战教程
- java中this的用法如:this.name=name
- Java String 里面输入跳脱 字符 \
- java并发之原子性与可见性(一)
- Eclipse常用设置
- java ReentrantLock重入锁的实现