ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Json实现深克隆

2022-05-24 01:03:26  阅读:223  来源: 互联网

标签:克隆 student 实现 student2 Json Student new Math subject


1. 存在BO VO DO  DTO  ,  JPA操作风格, 面向对象落库 —— 值得深克隆

package clone;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;

/**
 * @Author: Ryan.Dou
 * @Date: 2022/5/23 21:53
 * @Description: VO、BO、DO、DTO 风格项目
 */
public class Demo {
    public static void main(String[] args) throws IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        /**
         * 1.学生Ryan,课程Math
         *   假装这是一个BO, 被传到A系统-XXX方法
         */
        Student student = getStudent();
        /**
         * 2.A系统XXX方法要做什么
         *   (1) 对参数进行重新封装后调用B系统,比如Math改为  SH_Math
         *   (2)调用结束后,会把调用情况存到日志表(JPA操作风格,面向对象), 日志表存的是原始参数,不是封装后的参数
         *   (3)通过Json实现深拷贝,一份用来最后存日志表,一份用来重新封装调用B系统
         */
        String studentJsonString = getStudentJsonString(student,objectMapper);
        Student student1 = objectMapper.readValue(studentJsonString, Student.class);
        Student student2 = objectMapper.readValue(studentJsonString, Student.class);
        requestOtherSystem(student2);
        /**
         * 3.println
         * Student{name='Ryan', subject=Subject{subjectName='Math'}}——1525262377——1837760739
         * Student{name='StudentName_Ryan', subject=Subject{subjectName='SH_Math'}}——1418428263——2059904228
         */
        System.out.println(student1+"——"+student1.hashCode()+"——"+student1.getSubject().hashCode());
        System.out.println(student2+"——"+student2.hashCode()+"——"+student2.getSubject().hashCode());
        /**
         * 4.student1 存入日志表
         */

    }

    private static void requestOtherSystem(Student student2) {
        String subjectNameAfterBuild = buildParam(student2);
        student2.getSubject().setSubjectName(subjectNameAfterBuild);
    }

    private static String buildParam(Student student2) {
        student2.setName("StudentName_Ryan");
        return "SH_"+student2.getSubject().getSubjectName();
    }

    private static String getStudentJsonString(Student student,ObjectMapper objectMapper) throws JsonProcessingException {
        String s = objectMapper.writeValueAsString(student);
        return s;
    }

    private static Student getStudent() {
        Student student = new Student();
        Subject subject = new Subject();
        subject.setSubjectName("Math");
        student.setName("Ryan");
        student.setSubject(subject);
        return student;
    }
}

  

2.纯Map - Json , 面向SQL落库 —— new 个map就行

package clone;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: Ryan.Dou
 * @Date: 2022/5/23 23:08
 * @Description: Map - Json 风格项目
 */
public class Demo2 {
    public static void main(String[] args) throws JsonProcessingException {
        /**
         * 1.上游系统的操作,直接对A系统XXX方法传来一个map
         *      key = student   字符串类型
         *      value =  {"name":"Ryan","subject":{"subjectName":"Math"}}   字符串类型
         */
        Map<String, Object> paramMap = getParamMap();
        /**
         * 2.A系统XXX方法要做什么
         *   (1) 对参数进行重新封装后调用B系统,比如Math改为  SH_Math
         *   (2)调用结束后,会把调用情况存到日志表(MAP操作风格,面向SQL), 日志表存的是原始参数,不是封装后的参数
         *   (3)通过Json实现深拷贝,一份用来最后存日志表,一份用来重新封装调用B系统
         */
        HashMap<Object, Object> reqMap = new HashMap<>();
        reqMap.putAll(paramMap);
        /**
         * 3.print
         * 1753447031
         * 1810132623
         * 打印真实hash地址,发现引用不同
         * 但是reqMap已经通过putall获取全部信息,拿去想怎么搞都行
         * 最后把paramMap拿去存日志表即可
         */
        System.out.println(System.identityHashCode(paramMap));
        System.out.println(System.identityHashCode(reqMap));
    }

    private static Map<String,Object> getParamMap() throws JsonProcessingException {
        Student student = getStudent();
        ObjectMapper objectMapper = new ObjectMapper();
        String jsonString = objectMapper.writeValueAsString(student);
        Map<String,Object> paramMap = new HashMap<>();
        paramMap.put("student",jsonString);
        System.out.println(jsonString);
        return paramMap;
    }

    private static Student getStudent() {
        Student student = new Student();
        Subject subject = new Subject();
        subject.setSubjectName("Math");
        student.setName("Ryan");
        student.setSubject(subject);
        return student;
    }
}

  

标签:克隆,student,实现,student2,Json,Student,new,Math,subject
来源: https://www.cnblogs.com/douziming/p/16304023.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有