Java拷贝对象

最近有一个需求,要先把文件从U盘拷贝到sd卡。而这个文件的路径则和一个生成的数据有关系,也就是说之前我保存的路径是U盘的路径,最后生成的时候则需要实际在sd卡的路径。这很简单,把路径改了不就成了?

没那么简单,万一sd卡内存不够呢?不够你复制,这个时候你前面已经复制了,路径也改了,数据已经被“污染”了,只能从头再配置一遍。这显然是不合理的做法,所以需要我们拷贝一份原有的数据。但是在Java中默认是引用拷贝,并不是在堆里面给你另外分配一块内存,给你一个新的对象,而是拷贝一个引用给你。这并没有什么卵用,操作的是堆内的同一个对象,依旧逃不过数据被污染的命。所以需要我们自己实现深度拷贝。

我首先能想到的方案有两个:

  • 遍历这个类的所有属性,将每一个属性都拷贝一份
  • 先将对象序列化写入文件,再从文件中读取对象

第一种方式在类比较简单的时候还是比较实用的,我们为每一个属性申请内存并将值设置好。但是如果这个类内部的属性很复杂或者有比较复杂的父类,这个时候处理起来就麻烦很多了。第二种方式简单是简单,本来也打算就用这种方式来做。后来同事提醒我还有第三种方式:利用Json框架。

是的利用Json框架比如Gson或者FastJson之类的,可以很简单的将一个实体类转化为字符串,然后我们再将这个字符串转换成一个实体对象,代码如下:

Gson g = new Gson();
// 假设此处t是一个指向堆内对象的引用
String s = g.toJson(t);
T newT = g.fromJson(s, T.class);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 13,866评论 6 13
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,423评论 25 709
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,932评论 18 399
  • 患者主诉 1.在卧推初始阶段及引体向上动作时肩部顶端出现不舒服感,评定5/10 2.主动做肩部水平内收+上举时,肩...
    埋头苦读的熊阅读 8,254评论 0 0
  • 三十岁的曹仁英遇见了十七岁的男生李修,不能自拔地爱上他。他和自己的初恋有着一样的名字,一样的外貌。十七岁的爱情,仿...
    雨中葳蕤阅读 3,359评论 3 4