中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何將沒有實現Serializable的類存儲到Redis中

發布時間:2023-01-11 09:32:50 來源:億速云 閱讀:127 作者:iii 欄目:開發技術

這篇文章主要講解了“如何將沒有實現Serializable的類存儲到Redis中”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何將沒有實現Serializable的類存儲到Redis中”吧!

將實例對象存儲到Redis中報錯

你有沒有遇到過這種情況,需要將實例對象存儲到Redis中,但是類的字段包含第三方依賴中的類并且此類沒有 implements Serializable。 執行時就會報沒有序列化的錯:

Caused by: java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [com.entity.UserEntity]
	at org.springframework.core.serializer.DefaultSerializer.serialize(DefaultSerializer.java:43)
	at org.springframework.core.serializer.Serializer.serializeToByteArray(Serializer.java:56)
	at org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:60)
	... 54 more

有三種方法如下

ObjectHashMapper

ObjectHashMapper使用對象到哈希映射。

需存redis的類如下:

用戶類

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class UserEntity {
    /**
     * 用戶名
     */
    private String username;
    /**
     * 年齡
     */
    private Integer age;
    /**
     * 所屬部門
     */
    private Department department;
    /**
     * 創建時間
     */
    private Date createTime;
    /**
     * 手機號碼
     */
    private List<String> phoneNumber;
    /**
     * 愛好
     */
    private Map<String, Object> hobby;
}

部門類

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Department {
    /**
     * 部門id
     */
    private String depId;
    /**
     * 部門名稱
     */
    private String depName;
    /**
     * 父級部門
     */
    private String parentId;
}

注意:上面兩個類都沒有實現序列化

通過ObjectHashMapper的toHash和fromHash實現

List<String> phoneNumbers = new ArrayList<>();
phoneNumbers.add("13016541724");
phoneNumbers.add("18826173452");
Map<String, Object> hobbys = new HashMap<>();
hobbys.put("運行", "打羽毛球");
hobbys.put("電影", "看電影");
UserEntity userEntity = UserEntity.builder().username("張三").age(18).department(
        Department.builder().depId("djinefn213445nkqk").depName("研發中心").parentId("ncdjkn3j4njndcinw").build()
).createTime(new Date()).phoneNumber(phoneNumbers).hobby(hobbys)
        .build();
ObjectHashMapper objectHashMapper = new ObjectHashMapper();
Map<byte[], byte[]> map = objectHashMapper.toHash(userEntity);
redisTemplate.opsForHash().put("TEST_OBJECT", "a",  map);
Map<byte[], byte[]> map1 = (Map<byte[], byte[]>) redisTemplate.opsForHash().get("TEST_OBJECT", "a");
        UserEntity userEntityRes = (UserEntity) objectHashMapper.fromHash(map1);

Jackson2HashMapper

Jackson2HashMapper通過使用FasterXMLJackson為域對象提供Redis哈希映射。可以將頂級屬性映射為哈希字段名,也可以選擇展平結構。簡單類型映射到簡單值。復雜類型(嵌套對象、集合、映射等)表示為嵌套JSON。Jackson2HashMapper平展為所有嵌套屬性創建單獨的哈希條目,并盡可能將復雜類型解析為簡單類型。

List<String> phoneNumbers = new ArrayList<>();
phoneNumbers.add("13016541724");
phoneNumbers.add("18826173452");
Map<String, Object> hobbys = new HashMap<>();
hobbys.put("運行", "打羽毛球");
hobbys.put("電影", "看電影");
UserEntity userEntity = UserEntity.builder().username("張三").age(18).department(
        Department.builder().depId("djinefn213445nkqk").depName("研發中心").parentId("ncdjkn3j4njndcinw").build()
).createTime(new Date()).phoneNumber(phoneNumbers).hobby(hobbys)
        .build();
Jackson2HashMapper jackson2HashMapper = new Jackson2HashMapper(true);
Map<String, Object> map = jackson2HashMapper.toHash(userEntity);
redisTemplate.opsForHash().put("TEST_OBJECT", "a",  map);
Map<String, Object> map1 = (Map<String, Object>) redisTemplate.opsForHash().get("TEST_OBJECT", "a");
UserEntity userEntityRes = (UserEntity) jackson2HashMapper.fromHash(map1);

BeanUtilsHashMapper

BeanUtilsHashMapper使用Spring的BeanUtils。

List<String> phoneNumbers = new ArrayList<>();
phoneNumbers.add("13016541724");
phoneNumbers.add("18826173452");
Map<String, Object> hobbys = new HashMap<>();
hobbys.put("運行", "打羽毛球");
hobbys.put("電影", "看電影");
UserEntity userEntity = UserEntity.builder().username("張三").age(18).department(
        Department.builder().depId("djinefn213445nkqk").depName("研發中心").parentId("ncdjkn3j4njndcinw").build()
).createTime(new Date()).phoneNumber(phoneNumbers).hobby(hobbys)
        .build();
BeanUtilsHashMapper beanUtilsHashMapper = new BeanUtilsHashMapper(UserEntity.class);
Map<String, Object> map = beanUtilsHashMapper.toHash(userEntity);
redisTemplate.opsForHash().put("TEST_OBJECT", "a",  map);
Map<String, Object> map1 = (Map<String, Object>) redisTemplate.opsForHash().get("TEST_OBJECT", "a");
UserEntity userEntityRes = (UserEntity) beanUtilsHashMapper.fromHash(map1);

運行會報

Caused by: org.apache.commons.beanutils.ConversionException: Can't convert value '' to type interface java.util.List
	at org.apache.commons.beanutils.converters.AbstractConverter.conversionException(AbstractConverter.java:474)
	at org.apache.commons.beanutils.converters.StringConverter.convertToType(StringConverter.java:96)
	at org.apache.commons.beanutils.converters.AbstractConverter.handleMissing(AbstractConverter.java:312)
	... 58 more

從報錯中可以看出,Listinterface,無法轉換。將List改為ArrayList,Map改為HashMap再執行報如下錯誤

Caused by: org.apache.commons.beanutils.ConversionException: Can't convert value '' to type class java.util.ArrayList
	at org.apache.commons.beanutils.converters.AbstractConverter.conversionException(AbstractConverter.java:474)
	at org.apache.commons.beanutils.converters.StringConverter.convertToType(StringConverter.java:96)
	at org.apache.commons.beanutils.converters.AbstractConverter.handleMissing(AbstractConverter.java:312)
	... 58 more

排查會發現,phoneNumber的兩個手機號碼toHash后變成了一個手機號碼

如何將沒有實現Serializable的類存儲到Redis中

這是BeanUtilsHashMapper的一個缺陷。

感謝各位的閱讀,以上就是“如何將沒有實現Serializable的類存儲到Redis中”的內容了,經過本文的學習后,相信大家對如何將沒有實現Serializable的類存儲到Redis中這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

皋兰县| 台安县| 津南区| 隆德县| 三江| 和平区| 家居| 汉寿县| 辽中县| 顺平县| 湘潭市| 江源县| 廊坊市| 西昌市| 孟津县| 朝阳县| 潞西市| 兴海县| 荔波县| 香格里拉县| 南岸区| 武穴市| 枝江市| 清涧县| 房产| 绍兴县| 青岛市| 临沧市| 子洲县| 治县。| 白水县| 菏泽市| 雷山县| 绵竹市| 阿尔山市| 都兰县| 永嘉县| 青川县| 民和| 滨州市| 贵德县|