java序列化深克隆_克隆可序列化和不可序列化的Java对象

java序列化深克隆

开发人员经常依靠3d方库来避免重新发明轮子,尤其是在Java世界中,Apache和Spring这样的项目如此盛行。 在处理这些框架时,我们通常很少或根本无法控制其类的行为。

这有时会导致问题。 例如,如果您想深克隆一个不提供合适克隆方法的对象,除了编写大量代码之外,您还有什么选择?

通过序列化克隆

最简单的方法是通过利用对象可序列化进行克隆。 Apache Commons提供了一种执行此操作的方法,但是为了完整起见,下面也是您自己执行此操作的代码。

@SuppressWarnings("unchecked")
public static  T cloneThroughSerialize(T t) throws Exception {ByteArrayOutputStream bos = new ByteArrayOutputStream();serializeToOutputStream(t, bos);byte[] bytes = bos.toByteArray();ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes));return (T)ois.readObject();
}private static void serializeToOutputStream(Serializable ser, OutputStream os)throws IOException {ObjectOutputStream oos = null;try {oos = new ObjectOutputStream(os);oos.writeObject(ser);oos.flush();} finally {oos.close();}
}// using our custom method
Object cloned = cloneThroughSerialize (someObject);// or with Apache Commons
cloned = org.apache.commons.lang. SerializationUtils.clone(someObject);

但是,如果我们要克隆的类不是可序列化的,并且我们无法控制源代码或者无法将其设置为可序列化该怎么办?

选项1 – Java深度克隆库

有一个不错的小程序库,它可以深度克隆几乎所有Java对象- 克隆 。 它利用Java的出色反射功能来提供优化的对象的深克隆版本。

Cloner cloner=new Cloner();
Object cloned = cloner.deepClone(someObject);

如您所见,它非常简单有效,并且需要最少的代码。 除了这个简单的示例,它还具有一些更高级的功能,您可以在此处查看 。

选项2 – JSON克隆

如果我们无法将新库引入我们的代码库,该怎么办? 我们中有些人处理批准程序以引入新的库,对于一个简单的用例,可能不值得。

好吧,只要我们有某种方式可以序列化和还原对象,就可以进行深层复制。 JSON通常被使用,因此它是一个很好的选择,因为我们大多数人都使用一个或另一个JSON库。

Java中的大多数JSON库都可以有效地序列化任何POJO,而无需任何配置或映射。 这意味着,如果您具有JSON库并且不能或不会引入更多库来提供深度克隆,则可以利用现有的JSON库来获得相同的效果。 请注意,此方法将比其他方法慢,但是对于绝大多数应用程序,这不会引起任何性能问题。

以下是使用GSON库的示例。

@SuppressWarnings("unchecked")
public static  T cloneThroughJson(T t) {Gson gson = new Gson();String json = gson.toJson(t);return (T) gson.fromJson(json, t.getClass());
}
// ...
Object cloned = cloneThroughJson(someObject);

请注意,仅当复制的对象具有默认的无参数构造函数时,这才可能起作用。 对于GSON,您可以使用实例创建者来解决此问题。 其他框架具有类似的概念,因此如果遇到无法修改的类且没有默认构造函数的问题,则可以使用该框架。


结论

我建议做的一件事是,对于需要克隆的任何类,都应该添加一些单元测试,以确保一切正常。 这可以防止对类的更改(例如,升级库版本)在您不知情的情况下破坏应用程序,尤其是在您设置了持续集成环境的情况下。

我概述了几种在没有任何自定义代码的情况下克隆对象的方法。 如果您使用其他任何方法获得相同的结果,请分享。

参考: Carfey Software Blog上的JCG合作伙伴 Craig Flichel从Java轻松深度克隆了Java中的可序列化和不可序列化的对象 。

相关文章 :

  • Java最佳实践–高性能序列化
  • 使用Gson教程进行Android JSON解析
  • 在您的GWT应用程序中添加JSON功能
  • Java 7功能概述
  • Java Code Geeks编写的Java示例和代码段–正式发布

翻译自: https://www.javacodegeeks.com/2011/12/cloning-of-serializable-and-non.html

java序列化深克隆

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ukt机器人_doc/readme/feishu.md · 贫道法号-乱来/PrometheusAlert - Gitee.com

PrometheusAlert全家桶飞书配置说明-----------------飞书机器人目前支持V1和V2两个版本,区别在于地址的不同V1地址:https://open.feishu.cn/open-apis/bot/hook​/​xxxxxxxxxxxxxxxxxxV2地址:https://open.feishu.cn/open-apis/bot/v2/hook…

uiautomator的坑和AAPT命令方式启动一个应用程序

最近在使用UIautomator完成公司的一个主流程的自动化,因为不适用H5和IOS所以会放弃这个工具的使用,现在记录在使用uiautomator的一些问题: 案列1:使用命令去启动要运用的apk包 使用命令方式启动,可以使用SDK中自带的aa…

一文教你用java实现即时通讯软件的设计(附下载源码)

导读:即时通讯软件即所谓的聊天工具,其主要用途是用于文字信息的传递与文件传输。使用eclipse作为即时通讯软件的开发工具,使用Socket建立通讯渠道,多线程实现多台计算机同时进行信息的传递,swing技术等进行实际开发相…

在Python,Java和Kotlin中标记参数和重载

在多种语言之间跳来跳去可以帮助您注意到不同语言的习惯用法和最佳做法之间的某些差异。 比较有趣的差异之一与一个函数执行多项操作有关。 Python 我们先来看一下Python。 Python实际上无法重载,因为用相同的名称定义一个新的函数/方法只会覆盖前一个函数/方法。 …

vue 扫码页面限制区域_Vue.js 单页面多路由区域操作的实例详解

单页面多路由区域操作在一个页面中有两个及以上的区域,需要通过设置路由的index.js,来操作这些区域的内容app.vue 中设置:index.js中设置:import vue from vueimport router from vue-routerimport hello from /components/helloi…

Divide and conquer:Drying(POJ 3104)

烘干衣服 题目大意:主人公有一个烘干机,但是一次只能烘干一件衣服,每分钟失水k个单位的水量,自然烘干每分钟失水1个单位的水量(在烘干机不算自然烘干的那一个单位的水量),问你最少需要多长时间烘…

c#string倒数第二位插入字符_c#string倒数第二位插入字符_C#利用String类的IndexOf、LastIndexOf、...

一、String.IndexOfString.IndexOf 方法 (Char, Int32, Int32)报告指定字符在此实例中的第一个匹配项的索引(从0开始)。搜索从指定字符位置开始,并检查指定数量的字符位置。String.IndexOf(value, startIndex, count)参数value:要查找的 Unicode 字符。s…

使用所学的javaWeb知识,实现一个小型的记账管理系统

导读:控制过度消费通过记账,你会很清楚地知道自己的钱都用来做了什么,关于每分钱的去处心中都明明白白, 哪些是必要的开销,哪些是非理性的、应该避免的花费,分别占有多大的比例。有专家统计,个人 或者家庭的年节余比例要达到收人的40%才是正常的。参照这样的比例,对你找…

java小细节_为什么我喜欢Java的细节

java小细节他们说,Java太冗长了。 您可以找到Hello World程序的比较,这些程序在ruby中使用2行,在Java中使用10行,而要读取文件,您需要使用Java 20行和php中1行。 尽管示例经常被夸大(例如,计算导…

java 的 AccessController.doPrivileged使用

AccessController.doPrivileged意思是这个是特别的,不用做权限检查. 在什么地方会用到呢:加入1.jar中有类可以读取一个文件,现在我们要使用1.jar去做这个事情.但是我们的类本生是没有权限去读取那个文件的,一般情况下就是眼睁睁的看着了. 但是jiava提供了doPrivileged.在1.ja…

cordova 实现网页缓存_如何解决ionic,cordova混合开发的app缓存大的问题

如何解决ionic,cordova混合开发的app缓存大的问题关注:143 答案:2 mip版解决时间 2021-02-05 06:24提问者旧梦已过期2021-02-04 16:54如何解决ionic,cordova混合开发的app缓存大的问题最佳答案二级知识专家臸釪樶初2021-02-04 17:10可以试试sd卡挂在&a…

当年课设期末大作业,班主任让我们做一个新闻发布管理系统

导读:基于web的新闻发布及管理系统的设计与实现,是动态网页和数据库结合,通过事件来处理新闻。我们对最新信息的更新和发布需要比较及时,而动态交互网页能实现这些功能,新闻发布及管理系统就是一个能够在网上实现新闻的发布及管理,让人们更好的获取更新的新闻资讯。 随着电…

疫情期间,在家使用java的SSH框架实现一个简单的任务调度系统

导读:随着科学技术的飞速发展和各行各业的分工愈发明细化,对于改革传统的人工任务调度方式的呼声越来越大。得益于快速发展的计算机技术,我们看到了改革的方向。本系统是针对企业或者事业单位甚至一个小团队的任务调度而设计的,目的是改变传统的调度方式,通过计算机来计算…

你在乎的--世界在乎的

惊闻苍老师在某地做活动,距离公司不远,便蠢蠢欲动,招呼几个小伙伴一同前往。老师果然是全民偶像,人生导师,人气火爆,现场是人山人海,根本没有立足之地,后来听说,由于人太…

css3优惠卷上方锯齿_css3怎么实现锯齿边框?

白板的微信你这样的最好还是切图做用css3也达不到一毛一样的效果,如果你很想要尝试一下的话可以试试,不过边缘不是顺滑的感觉

改善Hibernate应用程序性能的7种方法

Hibernate是将Java Web应用程序与SQL数据库集成的好工具,但是当应用程序的响应时间开始显着增加时,我们应该怎么做? 当我们怀疑应用程序是否会随着客户群的增长而扩展时,我们该怎么办? 在花大价钱托管或重写代码之前&…

java网络爬虫技术也可以代替Python实现网络新闻分析系统

导读:自从大数据的概念被提出后,互联网数据成为了越来越多的科研单位进行数据挖掘的对象。网络新闻数据占据了互联网数据的半壁江山,相比传统媒体,其具有传播迅速、曝光时间短、含有网民舆论等相关特征,其蕴含的价值也愈来愈大。 利用相关网络爬虫技术与算法,实现网络媒体…

centos 服务器装与python34源码安装

http://www.111cn.net/sys/CentOS/63645.htm 1、CentOS安装Python的依赖包(不安装依赖包,会导致python安装不完整) yum groupinstall "Development tools"yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-…

CSDN:2020博客之星年度总评选大赛,趣味总结!

导读:从2020年正式写博客,第一次参加活动,竟然落选了,在此记录一下这个过程吧,方便找帖子链接,毕竟靠着本人的影响力还是能捞点饭票的,哈哈。 2020博客之星年度总评选活动地址:https…

Java 日期格式

转载于:https://www.cnblogs.com/bylion/p/5141022.html