Map,List,POJO深拷贝(序列化实现)方法与注意事项
转载请注明出处,谢谢!
方法1:
/*jdk >= 1.5*/
@SuppressWarnings("unchecked")
public static <T> T deepClone(T obj) {
T clonedObj = 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);
clonedObj = (T) ois.readObject();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
oos.close();
ois.close();
} catch (IOException e) {
e.printStackTrace();
} }
return clonedObj;
}
方法2:
/*jdk >= 1.7*/
@SuppressWarnings("unchecked")
public static <T> T deepCopy(T srcObj) {
T targetObj = null;
try
(
ByteArrayInputStream bais = new ByteArrayInputStream(deepCopyRepo(srcObj, new ByteArrayOutputStream()).toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais)
)
{
targetObj = (T) ois.readObject();
}
catch (Exception e)
{
e.printStackTrace();
}
return targetObj;
}
public static ByteArrayOutputStream deepCopyRepo(Object obj,ByteArrayOutputStream baos) throws Exception {
try
(
ObjectOutputStream oos = new ObjectOutputStream(baos)
)
{
oos.writeObject(obj);
}
return baos;
}
注意事项:
1.若Java 7 build 105 版本及以上,推荐使用方法2;try-with-resources语句,ARM(Automatic Resource Management) 自动资源管理。
2.被拷贝对象必须为可序列化的;当然,常用的如HashMap,ArrayList都是实现序列化的,直接使用本方法即可。
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
示例POJO:
import java.io.Serializable;
import java.util.List; public class Person implements Serializable{
/*自定义版本*/
private static final long serialVersionUID = 1L; private String name;
private List<Person> children;
/*age属性因transient修饰,所以被序列化机制隔离*/
private transient int age;
public Person(String name,List<Person> children,int age){
this.name = name;
this.children = children;
this.age = age;
}
public Person(){}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Person> getChildren() {
return children;
}
public void setChildren(List<Person> children) {
this.children = children;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override/*根据jvm返回的hashCode判断对象相同*/
public String toString() {
return "Person"+ "@" + Integer.toHexString(this.hashCode())+" [name=" + name + ", children=" + children + ", age="
+ age + "]";
}
}
junit:
@Test
public void testDeepCopy(){
List<Person> children = new ArrayList<>();
Person daughter = new Person("daughter",null,3);
Person son = new Person("son",null,1);
children.add(son);children.add(daughter);
Person father = new Person("sqiang",children,29);
System.out.println(father);
Person cfather = Utils.deepCopy(father);
System.out.println(cfather);
}
Console:

如图所示:
1.两组对象均不相同,实现了深拷贝
2.第二组的age=0,transient关键字对序列化起了作用。
Map,List,POJO深拷贝(序列化实现)方法与注意事项的更多相关文章
- java 复制Map对象(深拷贝与浅拷贝)
java 复制Map对象(深拷贝与浅拷贝) CreationTime--2018年6月4日10点00分 Author:Marydon 1.深拷贝与浅拷贝 浅拷贝:只复制对象的引用,两个引用仍然指向 ...
- No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer解决方法
org.codehaus.jackson.map.JsonMappingException: No serializer found for class org.hibernate.proxy.poj ...
- WPF控件深拷贝:序列化/反序列化
原文:WPF控件深拷贝:序列化/反序列化 今天DebugLZQ在做WPF拖动总结的时候,遇到了这个问题.baidu了下,貌似没有解决这个问题的权威答案,遂写下这篇博文. 我想做的事情是:拖动一个窗体内 ...
- MessagePack Java Jackson Dataformat - POJO 的序列化和反序列化
在本测试代码中,我们定义了一个 POJO 类,名字为 MessageData,你可以访问下面的链接找到有关这个类的定义. https://github.com/cwiki-us-demo/serial ...
- js引用类型深拷贝、浅拷贝方法封装
引用类型的深拷贝.浅拷贝在前端领域一直是个很重要的知识点,不仅在业务中频繁使用,也是面试官们喜欢考的的知识点之一.本篇将封装引用类型的深拷贝.浅拷贝方法,并解决在封装过程中出现的问题. 一.浅拷贝 浅 ...
- 批量产生ssh2项目中hibernate带注解的pojo类的快捷方法
近几个月一直在忙于项目组的ios应用项目的开发,没有太多时间去研究web应用方面的问题了.刚好,昨天有网友问到如何批量产生hibernate带注解的pojo类的快捷方法,所谓批量就是指将当前数据库中所 ...
- Map集合中value()方法与keySet()、entrySet()区别
http://blog.csdn.net/liu826710/article/details/9001254 在Map集合中 values():方法是获取集合中的所有的值----没有键,没有对应关系, ...
- js实现深拷贝的一些方法
在ECMAScript变量中包含两种不同类型的值:基本类型值和引用类型值. 基本类型值:Undefined.Null.Boolean.Number.String 引用类型值:Object.Array. ...
- java里面获取map的key和value的方法
获取map的key和value的方法分为两种形式: map.keySet():先获取map的key,然后根据key获取对应的value: map..entrySet():同时查询map的key和val ...
随机推荐
- 初识QT
前言:这是写给纯小白看的文章,大神可以自行绕道. QT的优势(摘自360百科): Qt支持下列操作系统: Microsoft Windows 95/98, Microsoft Windows NT, ...
- 部署github开源软件遇到的问题
jdk1.8源版本不一样: 将语言级别改为8,所有的jdk都配置为1.8 2. 遇到一些解析错误 应该是tomcat的jdk版本和项目的jdk版本不一样
- Maven项目不打包*.hbm.xml文件
<build> <finalName>basic</finalName> <plugins> <plugin> <groupId> ...
- css-display
1. none:隐藏对象.与visibility属性的hidden值不同,其不为被隐藏的对象保留其物理空间 2. inline:指定对象为内联元素. 3. block:指定对象为块元素. 4. inl ...
- 第五章:Python基础の生成器、迭代器、序列化和虚拟环境的应用
本课主题 生成器介紹和操作实战 迭代器介紹和操作实战 序例化和反序例化 Json 和 Pickle 操作实战 字符串格式化的应用 创建虚拟环境实战 本周作业 生成器介紹和操作实战 什么是生成器,生成器 ...
- 安装好的虚拟机,外部通过ssh工具连接,报connection failed
今天,新装了一台ubuntu虚拟机,安装成功以后,准备利用Xshell从外部访问linux,以减少切换,但是,在连接时,总是会报:connection failed. 于是,写下这篇随笔,以增加记忆且 ...
- 【三分法】hdu2438 Turn the corner
Problem Description Mr. West bought a new car! So he is travelling around the city.One day he comes ...
- 解读Scrum燃尽图
我的Understand the burndown chart读书笔记. 什么是燃尽图: 在敏捷开发中,燃尽图主要用于显示某一特定时间段内团队的剩余工作量,从而了解团队状态和项目进度. 燃尽图其实很简 ...
- java web 之 listen 与 filter
一.Listener监听器 Javaweb开发中的监听器,是用于监听web常见对象 HttpServletRequest HttpSession ServletContext 监听它们的创建与销毁.属 ...
- 《精通Linux C编程》1.3Linux系统的常用命令-笔记
[toc] 1.3.1了解Shell Linux常用命令的运行环境就是Shell,它是一种命令解析器,在用户和操作系统之间提供了一个交互接口. 用户在命令行输入命令,然后Shell对该命令进行解析并将 ...