当前位置:   article > 正文

JSON序列化与反序列化做深拷贝对象_java 对象 json序列化后是深拷贝吗

java 对象 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
/**
 * @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());
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

执行结果

通过日志打印,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
  • 1
  • 2
  • 3
  • 4
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/68600
推荐阅读
相关标签
  

闽ICP备14008679号