JSON序列化与反序列化做深拷贝对象
前言
开发中经常会遇到值传递和地址传递的情况,有时候想传入一个对象去某个方法中进行处理,地址传递在该方法内部会做一些处理会导致对象内存中的内容有所变化,这样就会出现不是自己想要的情况,常做的方式就是拷贝一个当前对象的副本传入进去处理,这样就不会影响原对象,这就涉及到深拷贝和浅拷贝。
这里分享通过JSON序列化和反序列化的方式得到一个深拷贝的对象。
代码案例
/**
* @author lvzb
* @date 2022/11/16 17:35
**/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Cat implements Serializable {
private static final long serialVersionUID = 7031485639225266586L;
private String name;
private int age;
private Cat blackCat;
}
/**
* @author lvzb
* @date 2022/11/16 17:36
**/
@Slf4j
class CatTest {
@SneakyThrows
@Test
void serialize() {
Cat cat = Cat.builder().name("波斯猫").age(5).build();
Cat blackCat = Cat.builder().name("黑猫警长").age(30).build();
cat.setBlackCat(blackCat);
// 没有该文件会直接创建该文件
ObjectOutputStream op = new ObjectOutputStream(new FileOutputStream("C:\\Users\\zlv11\\Desktop\\temp\\cat.txt"));
op.writeObject(cat);
ObjectInputStream in = new ObjectInputStream(new FileInputStream("C:\\Users\\zlv11\\Desktop\\temp\\cat.txt"));
Cat o = (Cat) in.readObject();
// 借助 fastJson 的序列化与反序列化也能做深拷贝
Cat cat1 = JSONObject.parseObject(JSON.toJSONString(cat), Cat.class);
log.warn("cat : {}", cat);
log.warn("o : {}", o);
log.warn("cat1 : {}", cat1);
log.error("cat=o:{}, cat=ca1:{}, cat1=o:{},cat.blackCat=o.blackCat:{} ,cat.blackCat=cat1.blackCat:{}",
cat == o, cat == cat1, cat == o, cat.getBlackCat() == o.getBlackCat(), cat.getBlackCat() == cat1.getBlackCat());
}
}
执行结果
通过日志打印,cat 和 o, cat 和 cat1,cat1和 o 及其内部的 blackCat 都是不一样的对象
10:05:45.945 [main] WARN com.zlv11.entity.CatTest - cat : Cat(name=波斯猫, age=5, blackCat=Cat(name=黑猫警长, age=30, blackCat=null))
10:05:45.972 [main] WARN com.zlv11.entity.CatTest - o : Cat(name=波斯猫, age=5, blackCat=Cat(name=黑猫警长, age=30, blackCat=null))
10:05:45.972 [main] WARN com.zlv11.entity.CatTest - cat1 : Cat(name=波斯猫, age=5, blackCat=Cat(name=黑猫警长, age=30, blackCat=null))
10:05:45.972 [main] ERROR com.zlv11.entity.CatTest - cat=o:false, cat=ca1:false, cat1=o:false,cat.blackCat=o.blackCat:false ,cat.blackCat=cat1.blackCat:false