当前位置: 首页 > news >正文

Java利用序列化实现对象的深拷贝

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

浅拷贝

对象实现的接口Cloneable的clone()方法存在一个缺陷,它并不会将对象的所有属性全部拷贝过来,而是有选择性的拷贝,即浅拷贝!基本规则如下:

      1、 基本类型

         如果变量是基本很类型,则拷贝其值,比如int、float等。

      2、 对象

         如果变量是一个实例对象,则拷贝其地址引用,也就是说此时新对象与原来对象是公用该实例变量。

      3、 String字符串

         若变量为String字符串,则拷贝其地址引用。但是在修改时,它会从字符串池中重新生成一个新的字符串,原有字符串对象保持不变。

所以:浅拷贝只是Java提供的一种简单的拷贝机制,不便于直接使用。

利用序列化实现对象的深拷贝

      如何利用序列化来完成对象的拷贝呢?在内存中通过字节流的拷贝是比较容易实现的。把母对象写入到一个字节流中,再从字节流中将其读出来,这样就可以创建一个新的对象了,并且该新对象与母对象之间并不存在引用共享的问题,真正实现对象的深拷贝。

public class CloneUtils {
    @SuppressWarnings("unchecked")
    public static <T extends Serializable> T clone(T obj){
        T cloneObj = null;
        try {
            //写入字节流
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            ObjectOutputStream obs = new ObjectOutputStream(out);
            obs.writeObject(obj);
            obs.close();
            
            //分配内存,写入原始对象,生成新对象
            ByteArrayInputStream ios = new ByteArrayInputStream(out.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(ios);
            //返回生成的新对象
            cloneObj = (T) ois.readObject();
            ois.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return cloneObj;
    }
}

 

转载于:https://my.oschina.net/liuyuantao/blog/1511983

相关文章:

  • How to run Java main class and pass application arguments in Maven?
  • Swift2.0语言教程之函数嵌套调用形式
  • Java中Action层、Service层、Modle层和Dao层的功能区分
  • mongodb中直接根据某个字段更新另外一个字段值
  • mysql 索引
  • 收集尝试登录到服务器的密码尝试失败的ip和次数
  • 谁的属性值优先被访问
  • 字符串拼接性能比较出乎意料的结果
  • P1038 神经网络
  • 了解Job和JobDeatil ,JobDataMap (三)
  • linux shell编程中的数组定义、遍历
  • MySQL 的wait_timeout参数
  • 快递鸟 即时查询接口
  • mySql基础
  • MySQL存储过程、触发器 小例子
  • android 一些 utils
  • co模块的前端实现
  • CSS盒模型深入
  • E-HPC支持多队列管理和自动伸缩
  • ERLANG 网工修炼笔记 ---- UDP
  • JavaScript类型识别
  • Linux链接文件
  • log4j2输出到kafka
  • php ci框架整合银盛支付
  • PHP CLI应用的调试原理
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Redis学习笔记 - pipline(流水线、管道)
  • 大快搜索数据爬虫技术实例安装教学篇
  • 浅谈Golang中select的用法
  • 容器服务kubernetes弹性伸缩高级用法
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 在Mac OS X上安装 Ruby运行环境
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​什么是bug?bug的源头在哪里?
  • # 达梦数据库知识点
  • #Linux(make工具和makefile文件以及makefile语法)
  • #NOIP 2014# day.1 T2 联合权值
  • #pragma预处理命令
  • (03)光刻——半导体电路的绘制
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (Forward) Music Player: From UI Proposal to Code
  • (HAL库版)freeRTOS移植STMF103
  • (Python) SOAP Web Service (HTTP POST)
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • .jks文件(JAVA KeyStore)
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)