深度拷贝 java_java 深度拷贝 复制 深度复制
1、深度拷贝、复制代码实现
最近需要用到比较两个对象属性的变化,其中一个是oldObj,另外一个是newObj,oldObj是newObj的前一个状态,所以需要在newObj的某个状态时,复制一个一样的对象,由于JAVA不支持深层拷贝,因此专门写了一个方法。
方法实现很简单,提供两种方式:
一种是序列化成数据流,前提是所有对象(对象中包含的对象...)都需要继承Serializable接口,如果都继承了那很容易,如果没有继承,而且也不打算修改所有类,可以用第二种方式。
第二种是将对象序列化为json,通过json来实现拷贝,这种方式需要用到net.sf.json.JSONObject。
具体代码如下:
import net.sf.json.JSONObject;
import java.io.*;
class deepCopy {
/**
* 深层拷贝
*
* @param
* @param obj
* @return
* @throws Exception
*/
static T copy(T obj) throws Exception {
//是否实现了序列化接口,即使该类实现了,他拥有的对象未必也有...
if(Serializable.class.isAssignableFrom(obj.getClass())){
//如果子类没有继承该接口,这一步会报错
try {
return copyImplSerializable(obj);
} catch (Exception e) {
//这里不处理,会运行到下面的尝试json
}
}
//如果序列化失败,尝试json序列化方式
if(hasJson()){
try {
return copyByJson(obj);
} catch (Exception e) {
//这里不处理,下面返回null
}
}
return null;
}
/**
* 深层拷贝 - 需要类继承序列化接口
* @param
* @param obj
* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
private static T copyImplSerializable(T obj) throws Exception {
ByteArrayOutputStream baos = null;
ObjectOutputStream oos = null;
ByteArrayInputStream bais = null;
ObjectInputStream ois = null;
Object o = null;
//如果子类没有继承该接口,这一步会报错
try {
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
bais = new ByteArrayInputStream(baos.toByteArray());
ois = new ObjectInputStream(bais);
o = ois.readObject();
return (T) o;
} catch (Exception e) {
throw new Exception("对象中包含没有继承序列化的对象");
} finally{
try {
assert baos != null;
baos.close();
assert oos != null;
oos.close();
assert bais != null;
bais.close();
assert ois != null;
ois.close();
} catch (Exception e2) {
//这里报错不需要处理
}
}
}
/**
* 是否可以使用json
* @return
*/
private static boolean hasJson(){
try {
Class.forName("net.sf.json.JSONObject");
return true;
} catch (Exception e) {
return false;
}
}
/**
* 深层拷贝 - 需要net.sf.json.JSONObject
* @param
* @param obj
* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
private static T copyByJson(T obj) throws Exception {
return (T) JSONObject.toBean(JSONObject.fromObject(obj),obj.getClass());
}
}
只需要调用copy方法就行。
深度拷贝 java_java 深度拷贝 复制 深度复制相关推荐
- 深度拷贝 java_Java深度拷贝方式和性能对比
前言 Java的深度拷贝大致分为克隆(实现Java的Clone接口)和序列化(实现Java的Serializable接口)两种,但是基于不同的序列化方式,有可以延伸出几种方式.下面分析一下每种的注意事 ...
- C++——构造函数(拷贝构造,拷贝复制),析构函数,操作符重载
C++--构造函数(拷贝构造,拷贝复制),析构函数,操作符重载 构造函数与析构函数:: 涉及构造函数还可以看这篇文章C++搞懂深拷贝初始化=与赋值=的区别 1.声明和定义构造函数和析构函数 构造函数在 ...
- python中复制、浅层拷贝、深层拷贝的区别
python中复制.浅层拷贝.深层拷贝的区别 一.学习要点: 1.python中的复制与拷贝的区别 2.python中浅层拷贝与深层拷贝的区别 二.代码: import copy a=[1,2,3,4 ...
- scp(安全拷贝)和rsync(增量复制)
scp(安全拷贝) 又称为全量复制,每次复制都会复制所有文件. 使用: scp -r 源文件用户名A@主机名1:path1 目标文件用户名B@主机名2:path2 -r: 递归,复制目录 执行过程: ...
- C++网易云课堂开发工程师-拷贝构造,拷贝复制,析构函数
1.带有指针的Class,Class with pointer member 当类内带指针,一定自己写出拷贝构造函数. String s1(); String s2("hello" ...
- 【火炉炼AI】深度学习003-构建并训练深度神经网络模型
[火炉炼AI]深度学习003-构建并训练深度神经网络模型 (本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotl ...
- 【深度学习】吴恩达深度学习-Course1神经网络与深度学习-第四周深度神经网络的关键概念编程(下)——深度神经网络用于图像分类:应用
在阅读这篇文章之前,请您先阅读:[深度学习]吴恩达深度学习-Course1神经网络与深度学习-第四周深度神经网络的关键概念编程(上)--一步步建立深度神经网络,这篇文章是本篇文章的前篇,没有前篇的基础 ...
- 什么是深度学习?我们为何需要深度学习?
我们在越来越多的领域都能遇到"机器学习"."深度学习"以及 "人工智能"等术语.但它们到底是什么意思?具体可以应用在哪里?我们又为什么需要? ...
- deepin更新失败_深度操作系统deepin 20更新:深度下载器和浏览器
原标题:深度操作系统deepin 20更新:深度下载器和浏览器 深度操作系统20 1003更新发布11031.106(build),新增备份还原.深度下载器.深度浏览器,针对桌面环境.应用软件等进行2 ...
最新文章
- 零基础小白如何学习好UI设计
- Linux安装Android开发环境
- 背包系列 hdu3449 有依赖背包
- Linux下用GDB调试程序崩溃错误
- 移动端Click300毫秒点击延迟 解决办法
- php post调用api,PHP(CURL)POST数据调用API简单示例
- array python 交集_Python基础(二)——列表和元组
- Flink的累加器(Accumulator)应用
- 正则 文字输入不超过5个汉字或者10个字符
- python3 输出系统信息
- 【渝粤教育】国家开放大学2018年春季 0047-21T计算机办公软件应用 参考试题
- 拓端tecdat|Stata估算观测数据的风险比
- 智引IT综合管理解决方案
- 10 工作中常见知识汇总
- el-select 设置为可手动输入
- vue做混合式app_基于vue2.0开发混合app的思考
- 变频器的工作原理与结构介绍
- php pecl 扩展,PECL
- 基于TensorRT 5.x的网络推理加速(python)
- html如何给盒子设置位置,CSS盒子定位