欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring項目中如何自定義序列化工具

 更新時間:2024年12月12日 15:49:51   作者:vampire-wpre  
這篇文章主要為大家詳細介紹了Spring項目中自定義序列化工具的相關知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

在編寫web項目的場景下:

序列化:服務器端處理完業(yè)務邏輯后,需要將數(shù)據(jù)(如對象)轉(zhuǎn)換為客戶端能夠理解的格式(通常是JSON),這個過程就是序列化。序列化后的數(shù)據(jù)可以通過HTTP響應發(fā)送給客戶端。

反序列化:客戶端接收到服務器的響應后,需要將這些數(shù)據(jù)(通常是JSON或XML格式的字符串)轉(zhuǎn)換回客戶端程序能夠處理的對象,這個過程就是反序列化。

使用案例

所有的序列化和反序列化都是基于ObjectMapper的,序列化調(diào)用writeValue方法(如果是json數(shù)據(jù),使用writeValueAsString),反序列化調(diào)用readValue
編寫測試類

@SpringBootTest
public class JacksonTest {
    @Test
    void jacksonTest() {
        //定義ObjectMapper(所有的序列化和反序列化都是基于ObjectMapper)
        ObjectMapper objectMapper = new ObjectMapper();

        CommonResult<String> result = CommonResult.error(500, "系統(tǒng)錯誤");
        String str;

        //序列化,把對象序列化成String
        //其實就是把對象轉(zhuǎn)成json字符串
        try {
            str = objectMapper.writeValueAsString(result);
            System.out.println(str);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
        //反序列化(就是把json字符串轉(zhuǎn)換成對象)
        CommonResult<String> commonResult = null;//參數(shù)2:要轉(zhuǎn)換成的對象
        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);//構(gòu)造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);
        }

    }

}

自定義序列化工具

在使用案例中,我們發(fā)現(xiàn)在代碼中出現(xiàn)了很多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統(tǒng)一異常
    //Callable<T> parser,這個參數(shù),支持我們使用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(() -> {
            //執(zhí)行序列化的操作
            //如果此處出現(xiàn)異常,直接會在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.構(gòu)造JavaType
        JavaType javaType = JacksonUtil.getObjectMapper().
                getTypeFactory().//獲取類型工廠
                        constructParametricType(List.class, paramClasses);//構(gòu)造List的類型

        //2.反序列化
        return JacksonUtil.tryParse(() -> {
            return JacksonUtil.getObjectMapper().readValue(content, javaType);
        });

    }

}

到此這篇關于Spring項目中如何自定義序列化工具的文章就介紹到這了,更多相關Spring自定義序列化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

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

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

    Netty是由JBOSS提供的一個java開源框架,現(xiàn)為?Github上的獨立項目。Netty提供異步的、事件驅(qū)動的網(wǎng)絡應用程序框架和工具,用以快速開發(fā)高性能、高可靠性的網(wǎng)絡服務器和客戶端程序,這篇文章主要介紹了Netty粘包拆包及使用原理
    2022-08-08
  • java實現(xiàn)簡易撲克牌游戲

    java實現(xiàn)簡易撲克牌游戲

    這篇文章主要為大家詳細介紹了java實現(xiàn)簡易撲克牌游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • Java修飾符abstract與static及final的精華總結(jié)

    Java修飾符abstract與static及final的精華總結(jié)

    abstract、static、final三個修飾符是經(jīng)常會使用的,對他們的概念必須非常清楚,弄混了會產(chǎn)生些完全可以避免的錯誤,比如final和abstract不能一同出現(xiàn),static和abstract不能一同出現(xiàn),下面我們來詳細了解
    2022-04-04
  • Spring中Eureka的自我保護詳解

    Spring中Eureka的自我保護詳解

    這篇文章主要介紹了Spring中Eureka的自我保護詳解,當Eureka Server節(jié)點在短時間內(nèi)丟失過多客戶端時(可能發(fā)生了網(wǎng)絡分區(qū)故障),那么這個節(jié)點就會進入自我保護模式,一旦進入該模式,Eureka Server就會保護服務注冊表中的信息,需要的朋友可以參考下
    2023-11-11
  • Maven構(gòu)建SpringBoot集成MyBatis過程

    Maven構(gòu)建SpringBoot集成MyBatis過程

    文章介紹了如何使用Maven創(chuàng)建一個Spring Boot項目,并集成MyBatis,首先,配置Maven環(huán)境,然后在pom.xml中添加MyBatis依賴,配置數(shù)據(jù)庫連接信息,最后生成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的前期綁定在程序執(zhí)行前根據(jù)編譯時類型綁定,調(diào)用開銷較小,如C語言只有前期綁定這種方法調(diào)用
    2014-02-02
  • Java三大特性之封裝詳解

    Java三大特性之封裝詳解

    面向?qū)ο缶幊陶Z言是對客觀世界的模擬,客觀世界里成員變量都是隱藏在對象內(nèi)部的,外界無法直接操作和修改。?封裝可以被認為是一個保護屏障,防止該類的代碼和數(shù)據(jù)被其他類隨意訪問。本文將來和大家詳細說說Java中的封裝,需要的可以了解一下
    2022-10-10
  • Springboot主程序類注解配置過程圖解

    Springboot主程序類注解配置過程圖解

    這篇文章主要介紹了Springboot主程序類注解配置過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • Java Arrays.asList使用方法解析

    Java Arrays.asList使用方法解析

    這篇文章主要介紹了Java Arrays.asList使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03

最新評論