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

 更新时间:2024年12月12日 15:49:51   作者:vampire-wpre  
这篇文章主要为大家详细介绍了Spring项目中自定义序列化工具的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

在编写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自定义序列化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Netty粘包拆包及使用原理详解

    Netty粘包拆包及使用原理详解

    Netty是由JBOSS提供的一个java开源框架,现为 Github上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序,这篇文章主要介绍了Netty粘包拆包及使用原理
    2022-08-08
  • java实现简易扑克牌游戏

    java实现简易扑克牌游戏

    这篇文章主要为大家详细介绍了java实现简易扑克牌游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • Java修饰符abstract与static及final的精华总结

    Java修饰符abstract与static及final的精华总结

    abstract、static、final三个修饰符是经常会使用的,对他们的概念必须非常清楚,弄混了会产生些完全可以避免的错误,比如final和abstract不能一同出现,static和abstract不能一同出现,下面我们来详细了解
    2022-04-04
  • Spring中Eureka的自我保护详解

    Spring中Eureka的自我保护详解

    这篇文章主要介绍了Spring中Eureka的自我保护详解,当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式,一旦进入该模式,Eureka Server就会保护服务注册表中的信息,需要的朋友可以参考下
    2023-11-11
  • Maven构建SpringBoot集成MyBatis过程

    Maven构建SpringBoot集成MyBatis过程

    文章介绍了如何使用Maven创建一个Spring Boot项目,并集成MyBatis,首先,配置Maven环境,然后在pom.xml中添加MyBatis依赖,配置数据库连接信息,最后生成Mapper XML文件和DAO层代码
    2024-11-11
  • Spring data jpa @Query update的坑及解决

    Spring data jpa @Query update的坑及解决

    这篇文章主要介绍了Spring data jpa @Query update的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • java的前期绑定和后期绑定使用示例

    java的前期绑定和后期绑定使用示例

    java的前期绑定在程序执行前根据编译时类型绑定,调用开销较小,如C语言只有前期绑定这种方法调用
    2014-02-02
  • Java三大特性之封装详解

    Java三大特性之封装详解

    面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。 封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问。本文将来和大家详细说说Java中的封装,需要的可以了解一下
    2022-10-10
  • Springboot主程序类注解配置过程图解

    Springboot主程序类注解配置过程图解

    这篇文章主要介绍了Springboot主程序类注解配置过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Java Arrays.asList使用方法解析

    Java Arrays.asList使用方法解析

    这篇文章主要介绍了Java Arrays.asList使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03

最新评论