最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

在編寫web項目的場景下:

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

反序列化:客戶端接收到服務(wù)器的響應(yīng)后,需要將這些數(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);
        });

    }

}

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

相關(guān)文章

  • 分析JVM的組成結(jié)構(gòu)

    分析JVM的組成結(jié)構(gòu)

    JVM(虛擬機):指以軟件的方式模擬具有完整硬件系統(tǒng)功能、運行在一個完全隔離環(huán)境中的完整計算機系統(tǒng) ,是物理機的軟件實現(xiàn)。JVM和VMware,Virtual Box等虛擬機一樣,都是運行在操作系統(tǒng)之上的計算機系統(tǒng)
    2021-06-06
  • 詳解SpringBoot中的統(tǒng)一異常處理

    詳解SpringBoot中的統(tǒng)一異常處理

    這篇文章主要介紹了詳解SpringBoot中的統(tǒng)一異常處理,在獨立的某個地方,比如單獨一個類,定義一套對各種異常的處理機制,需要的朋友可以參考下
    2023-05-05
  • 在webservice里調(diào)用耗時方法出錯的解決方案

    在webservice里調(diào)用耗時方法出錯的解決方案

    這篇文章主要介紹了在webservice里調(diào)用耗時方法出錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • elasticsearch?java客戶端action的實現(xiàn)簡單分析

    elasticsearch?java客戶端action的實現(xiàn)簡單分析

    這篇文章主要為大家介紹了elasticsearch?java客戶端action的實現(xiàn)簡單分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04
  • Spring?MVC啟動之HandlerMapping作用及實現(xiàn)詳解

    Spring?MVC啟動之HandlerMapping作用及實現(xiàn)詳解

    這篇文章主要為大家介紹了Spring?MVC啟動之HandlerMapping作用及實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Java 實現(xiàn)協(xié)程的方法

    Java 實現(xiàn)協(xié)程的方法

    這篇文章主要介紹了Java 實現(xiàn)協(xié)程的方法,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-10-10
  • intellij idea中安裝、配置mybatis插件Free Mybatis plugin的教程詳解

    intellij idea中安裝、配置mybatis插件Free Mybatis plugin的教程詳解

    這篇文章主要介紹了intellij idea中安裝、配置mybatis插件Free Mybatis plugin的教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Spring Cloud Feign內(nèi)部實現(xiàn)代碼細節(jié)

    Spring Cloud Feign內(nèi)部實現(xiàn)代碼細節(jié)

    Feign 的英文表意為“假裝,偽裝,變形”, 是一個http請求調(diào)用的輕量級框架,可以以Java接口注解的方式調(diào)用Http請求,而不用像Java中通過封裝HTTP請求報文的方式直接調(diào)用。接下來通過本文給大家分享Spring Cloud Feign內(nèi)部實現(xiàn)代碼細節(jié),感興趣的朋友一起看看吧
    2021-05-05
  • SpringBoot整合Lombok及常見問題解決

    SpringBoot整合Lombok及常見問題解決

    本文主要介紹了SpringBoot整合Lombok及常見問題解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Spring中Bean的作用域和自動裝配方式

    Spring中Bean的作用域和自動裝配方式

    這篇文章主要介紹了Spring中Bean的作用域和自動裝配方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評論

吕梁市| 嘉峪关市| 华坪县| 洪江市| 潼南县| 林甸县| 松潘县| 土默特右旗| 阜新| 社旗县| 华坪县| 高清| 新竹市| 灌云县| 阜平县| 新平| 酒泉市| 新田县| 澄城县| 乌兰浩特市| 阿克| 桐城市| 禄丰县| 太仆寺旗| 鲜城| 隆安县| 开化县| 邓州市| 芦溪县| 上虞市| 荆州市| 上犹县| 枣强县| 贵溪市| 卢龙县| 黄冈市| 伊宁市| 桐柏县| 麦盖提县| 固原市| 井冈山市|