JSON序列化与反序列化做深拷贝对象

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值