当前位置: 代码网 > it编程>编程语言>Java > Spring项目中如何自定义序列化工具

Spring项目中如何自定义序列化工具

2024年12月13日 Java 我要评论
在编写web项目的场景下:序列化:服务器端处理完业务逻辑后,需要将数据(如对象)转换为客户端能够理解的格式(通常是json),这个过程就是序列化。序列化后的数据可以通过http响应发送给客户端。反序列

在编写web项目的场景下:

序列化:服务器端处理完业务逻辑后,需要将数据(如对象)转换为客户端能够理解的格式(通常是json),这个过程就是序列化。序列化后的数据可以通过http响应发送给客户端。

反序列化:客户端接收到服务器的响应后,需要将这些数据(通常是json或xml格式的字符串)转换回客户端程序能够处理的对象,这个过程就是反序列化。

使用案例

所有的序列化和反序列化都是基于objectmapper的,序列化调用writevalue方法(如果是json数据,使用writevalueasstring),反序列化调用readvalue
编写测试类

@springboottest
public class jacksontest {
    @test
    void jacksontest() {
        //定义objectmapper(所有的序列化和反序列化都是基于objectmapper)
        objectmapper objectmapper = new objectmapper();

        commonresult<string> result = commonresult.error(500, "系统错误");
        string str;

        //序列化,把对象序列化成string
        //其实就是把对象转成json字符串
        try {
            str = objectmapper.writevalueasstring(result);
            system.out.println(str);
        } catch (jsonprocessingexception e) {
            throw new runtimeexception(e);
        }
        //反序列化(就是把json字符串转换成对象)
        commonresult<string> commonresult = null;//参数2:要转换成的对象
        try {
            commonresult = objectmapper.readvalue(str,
                                                  commonresult.class);
        } catch (jsonprocessingexception e) {
            throw new runtimeexception(e);
        }
        system.out.println(commonresult.getcode() + "," + commonresult.getmsg());
        //list序列化
        //定义list对象
        list<commonresult<string>> commonresults = arrays.aslist(commonresult.success("success1"),
                                                                 commonresult.success("success2"));

        try {
            str = objectmapper.writevalueasstring(commonresults);
        } catch (jsonprocessingexception e) {
            throw new runtimeexception(e);
        }

        //list反序列化
        javatype javatype = objectmapper.
            gettypefactory().//获取类型工厂
            constructparametrictype(list.class, commonresult.class);//构造list的类型,list<commonresult<string>>

        try {
            commonresults = objectmapper.readvalue(str, javatype);
            for (commonresult<string> results : commonresults) {
                system.out.println(results.getdata());
            }

        } catch (jsonprocessingexception e) {
            throw new runtimeexception(e);
        }

    }

}

自定义序列化工具

在使用案例中,我们发现在代码中出现了很多try catch,这样显得代码很不雅观,我们可以借鉴springboot的方法,具体的操作看代码

public class jacksonutil {
    private jacksonutil() {

    }
    
	//对objectmapper进行单例化操作
    private final static objectmapper object_mapper;

    static {
        //初始化object_mapper
        object_mapper = new objectmapper();
    }
    
	//get方法
    private static objectmapper getobjectmapper() {
        return object_mapper;
    }

    private static <t> t tryparse(callable<t> parser) {
        return tryparse(parser, jacksonexception.class);
    }

    //借鉴springboot统一异常
    //callable<t> parser,这个参数,支持我们使用lambda表达式进行处理
    private static <t> t tryparse(callable<t> parser, class<? extends exception> check) {
        try {
            return parser.call();
        } catch (exception var4) {
            exception ex = var4;
            if (check.isassignablefrom(ex.getclass())) {
                throw new jsonparseexception(ex);
            }
            throw new illegalstateexception(ex);
        }
    }


    /**
     * 序列化方法
     *
     * @param o
     * @return
     */
    public static string writevalueasstring(object o) {
        return jacksonutil.tryparse(() -> {
            //执行序列化的操作
            //如果此处出现异常,直接会在tryparse这里捕获
            return jacksonutil.getobjectmapper().writevalueasstring(o);
        });
    }


    /**
     * 反序列化object方法
     *
     * @param content
     * @param valuetype
     * @param <t>
     * @return
     */
    public static <t> t readvalue(string content, class<t> valuetype) {
        return jacksonutil.tryparse(() -> {
            return jacksonutil.getobjectmapper().readvalue(content, valuetype);
        });
    }

    /**
     * 反序列化list
     *
     * @param content
     * @param paramclasses
     * @param <t>
     * @return
     */
    public static <t> t readlistvalue(string content, class<?> paramclasses) {

        //1.构造javatype
        javatype javatype = jacksonutil.getobjectmapper().
                gettypefactory().//获取类型工厂
                        constructparametrictype(list.class, paramclasses);//构造list的类型

        //2.反序列化
        return jacksonutil.tryparse(() -> {
            return jacksonutil.getobjectmapper().readvalue(content, javatype);
        });

    }

}

到此这篇关于spring项目中如何自定义序列化工具的文章就介绍到这了,更多相关spring自定义序列化内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

  • 基于Maven pom文件使用分析

    基于Maven pom文件使用分析

    projectmaven 是一个强大的构建和依赖管理工具,pom.xml 文件是 maven 项目的核心配置文件,用于定义项目的构建、依赖关系、插件、目标等。它... [阅读全文]
  • Java8 CompletableFuture异步编程解读

    Java8 CompletableFuture异步编程解读

    completablefuturede介绍java 8 引入了 completablefuture 类,这是 java 异步编程的一个重要进展。completa... [阅读全文]
  • java集合超详细(最新推荐)

    1 - 概述所有的集合类和集合接口都在java.util包下。在内存中申请一块空间用来存储数据,在java中集合就是替换掉定长的数组的一种引用数据类型。2 - 集合与数组的区别长度…

    2024年12月14日 编程语言
  • Mybatis中SQL的执行过程详解

    Mybatis中SQL的执行过程详解

    mybatis 框架sql执行过程数据库操作映射方式mybatis支持两种方式进行数据库操作映射:映射文件:通过xml文件来定义sql语句和映射关系注解方式:通... [阅读全文]
  • IDEA性能优化方法解决卡顿问题

    IDEA性能优化方法解决卡顿问题

    前言我们在使用 intellij idea的时候有时候会觉得卡顿,那么如何在不升级电脑配置的情况下让 intellij idea的性能更好呢?我们可以通过去修改... [阅读全文]
  • java 抽象类示例详解

    一、抽象类概述:我们知道,类用来模拟现实事物。一个类可以模拟一类事物,而某个类的一个实例化对象可以模拟某个属于该类的具体的事物。类中描绘了该类所有对象共同的特性,当一个类中给出的信…

    2024年12月14日 编程语言

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com