您好,登錄后才能下訂單哦!
這篇文章主要講解了“如何將沒有實現Serializable的類存儲到Redis中”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何將沒有實現Serializable的類存儲到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
使用對象到哈希映射。
需存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
通過使用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
使用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
從報錯中可以看出,List
為interface
,無法轉換。將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后變成了一個手機號碼
這是BeanUtilsHashMapper
的一個缺陷。
感謝各位的閱讀,以上就是“如何將沒有實現Serializable的類存儲到Redis中”的內容了,經過本文的學習后,相信大家對如何將沒有實現Serializable的類存儲到Redis中這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。