最近有一个需求,要先把文件从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);