java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring自定义序列化

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

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

您可能感兴趣的文章:
阅读全文