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

Jackson序列化丟失泛型的解決

 更新時間:2021年06月18日 14:49:02   作者:祈雨v  
這篇文章主要介紹了Jackson序列化丟失泛型的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Jackson序列化丟失泛型

經(jīng)過

項目中遇到一個奇怪的bug,即一個Map<Integer,List<Integer>>的泛型map,向map中g(shù)et一個存在的key,事實上卻返回null。

經(jīng)過排查,發(fā)現(xiàn)是該map被Jackson序列化后,key的類型從Integer變成了String類型。再經(jīng)過反序列化,即使已經(jīng)聲明key泛型的Integer,反序列化后內(nèi)存數(shù)據(jù)中的key為String并不是Integer類型且并未拋出異常。

復現(xiàn)

1、聲明一個key泛型為Integer的map

Map<Integer, List<Integer>> map = new HashMap<>();
map.put(1, Arrays.asList(1,2,3));
map.put(1001,Arrays.asList(4,5,6));
map.put(50001,Arrays.asList(7,8,9));

2、申明Jackson序列化工具

ObjectMapper om = new ObjectMapper();
om.setVisibility(JsonMethod.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

3、序列化

String json = om.writeValueAsString(map);
System.out.println(json); 

4、序列化輸出

["java.util.HashMap",{"1":["java.util.ArrayList",[1,2,3]],"50001":["java.util.ArrayList",[7,8,9]],"1001":["java.util.ArrayList",[4,5,6]]}]

5、反序列化

Map<Integer,List<Integer>> map2 = om.readValue(json, Map.class);
System.out.println(map2);

6、反序列化輸出

{1=[1, 2, 3], 50001=[7, 8, 9], 1001=[4, 5, 6]}

分析

由步驟4見得Map<Integer,List<Integer>>序列化后,key的Integer泛型已經(jīng)丟失,類型由Integer變?yōu)榱薙tring。

且步驟6反序列化后,盡管map的key申明為Integer類型,但是Jackson反序列化后,依然將key反序列化為String類型,且未拋出任何異常。此時通過Integer的key獲取map對應的值永遠返回null。

解決

對于可以指定返回類型的反序列化,可以通過Jackson的API指定反序列化對象的泛型。

Map<Integer, List<Integer>> map3 = om.readValue(json, new TypeReference<Map<Integer, List<Integer>>>(){});
System.out.println(map3);

對于通用型序列化反序列化的場景,例如RedisTemplate的序列化反序列化工具,無法指定特定的反序列化對象泛型,可以考慮使用其他序列化工具替代Jackson例如Fastjson。

序列化后反序列化丟失幾大問題總結(jié)

序列化 (Serialization)將對象的狀態(tài)信息轉(zhuǎn)換為可以存儲或傳輸?shù)男问降倪^程。在序列化期間,對象將其當前狀態(tài)寫入到臨時或持久性存儲區(qū)。

以后,可以通過從存儲區(qū)中讀取或反序列化對象的狀態(tài),重新創(chuàng)建該對象。

反序列化失敗原因:(目前只遇到過兩種)

沒有添加 serialVersionUID 可能會導致反序列化失敗

生成默認的serialVersionUID --> [Add default serial version ID]

例如:

private static final long serialVersionUID = 1L;

生成串行serialVersionUID --> [Add generated serial version ID]

例如:

private static final long serialVersionUID =-5666638870709238304L;

注解生成serialVersionUID --> [Add @SuppressWarnings serial to serialVersionUID]

例如:

@SuppressWarnings("person")
public class Person implements Serializable {}

繼承了一個已經(jīng)實現(xiàn)序列化接口的父類

并且與父類有重復的屬性,在反序列化的時候就會導致重復的屬性數(shù)據(jù)丟失

然后還有第三種就是使用Spring框架的情況下

如果布爾類型的對象屬性名以is開頭,在序列化的時候會導致該屬性值丟失

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Mybatis中typeAliases標簽和package標簽使用

    Mybatis中typeAliases標簽和package標簽使用

    這篇文章主要介紹了Mybatis中typeAliases標簽和package標簽使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringBoot CommandLineRunner應用啟動后執(zhí)行代碼實例

    SpringBoot CommandLineRunner應用啟動后執(zhí)行代碼實例

    本文將深入探討CommandLineRunner的工作原理、使用場景及最佳實踐,幫助開發(fā)者充分利用這一功能,構(gòu)建更加健壯的Spring Boot應用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Java泛型定義與用法入門示例

    Java泛型定義與用法入門示例

    這篇文章主要介紹了Java泛型定義與用法,結(jié)合實例形式分析了java泛型的功能、定義、應用場景及相關(guān)使用注意事項,需要的朋友可以參考下
    2019-08-08
  • restTemplate未設置連接數(shù)導致服務雪崩問題以及解決

    restTemplate未設置連接數(shù)導致服務雪崩問題以及解決

    面對線上問題,仔細分析原因,及時調(diào)整配置,能有效解決問題,本文詳細描述了線上遇到流量突增引發(fā)的問題,通過查看代碼和連接池信息,分析出問題的原因是連接池滿了,連接池大小配置不足以應對大并發(fā)流量,通過調(diào)整連接池大小配置
    2024-10-10
  • Java中的DecimalFormat用法解析

    Java中的DecimalFormat用法解析

    這篇文章主要介紹了Java中的DecimalFormat用法解析,DecimalFormat是Java中用于格式化數(shù)字的類,它提供了一種簡單而靈活的方式來格式化數(shù)字,包括指定小數(shù)位數(shù)、千位分隔符、貨幣符號等,需要的朋友可以參考下
    2023-10-10
  • Java使用Soap方式調(diào)用WebService接口代碼示例

    Java使用Soap方式調(diào)用WebService接口代碼示例

    Java調(diào)用WebService接口是指通過Java語言來訪問并與WebService進行交互,WebService是一種基于Web的服務架構(gòu),它通過標準的XML和HTTP協(xié)議來提供服務,這篇文章主要給大家介紹了關(guān)于Java使用Soap方式調(diào)用WebService接口的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • Java程序打包成帶參數(shù)的jar文件實例代碼

    Java程序打包成帶參數(shù)的jar文件實例代碼

    這篇文章主要介紹了Java程序打包成帶參數(shù)的jar文件實例代碼,需要的朋友可以參考下
    2017-09-09
  • Java開發(fā)中為什么要使用單例模式詳解

    Java開發(fā)中為什么要使用單例模式詳解

    單例對于大家來說并不陌生,但是在什么時候用單例呢?為什么要用呢?本文就帶大家了解一下為什么要使用單例,文中有非常詳細的介紹,需要的朋友可以參考下
    2021-06-06
  • SpringBoot如何讀取war包jar包和Resource資源

    SpringBoot如何讀取war包jar包和Resource資源

    這篇文章主要介紹了SpringBoot如何讀取war包jar包和Resource資源,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • 如何在32位Windows系統(tǒng)下安裝Java

    如何在32位Windows系統(tǒng)下安裝Java

    這篇文章主要介紹了如何在32位Windows系統(tǒng)下安裝Java,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04

最新評論

精河县| 沾益县| 理塘县| 沾化县| 南丹县| 姜堰市| 资中县| 环江| 密山市| 榆树市| 上蔡县| 湖州市| 眉山市| 普安县| 喀喇| 元江| 宜章县| 离岛区| 宜黄县| 滨海县| 资兴市| 青田县| 乌审旗| 西贡区| 蓬溪县| 高青县| 卓尼县| 珠海市| 河间市| 岳西县| 泾源县| 左权县| 土默特左旗| 唐海县| 井冈山市| 调兵山市| 德州市| 同德县| 疏附县| 翁源县| 新密市|