经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Redis » 查看文章
将没有实现Serializable的类存储到Redis中方法示例
来源:jb51  时间:2023/1/11 8:38:27  对本文有异议

将实例对象存储到Redis中报错

你有没有遇到过这种情况,需要将实例对象存储到Redis中,但是类的字段包含第三方依赖中的类并且此类没有 implements Serializable。 执行时就会报没有序列化的错:

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

有三种方法如下

ObjectHashMapper

ObjectHashMapper使用对象到哈希映射

需存redis的类如下:

用户类

  1. @Data
  2. @Builder
  3. @AllArgsConstructor
  4. @NoArgsConstructor
  5. public class UserEntity {
  6. /**
  7. * 用户名
  8. */
  9. private String username;
  10. /**
  11. * 年龄
  12. */
  13. private Integer age;
  14. /**
  15. * 所属部门
  16. */
  17. private Department department;
  18. /**
  19. * 创建时间
  20. */
  21. private Date createTime;
  22. /**
  23. * 手机号码
  24. */
  25. private List<String> phoneNumber;
  26. /**
  27. * 爱好
  28. */
  29. private Map<String, Object> hobby;
  30. }

部门类

  1. @Data
  2. @Builder
  3. @NoArgsConstructor
  4. @AllArgsConstructor
  5. public class Department {
  6. /**
  7. * 部门id
  8. */
  9. private String depId;
  10. /**
  11. * 部门名称
  12. */
  13. private String depName;
  14. /**
  15. * 父级部门
  16. */
  17. private String parentId;
  18. }

注意:上面两个类都没有实现序列化

通过ObjectHashMapper的toHash和fromHash实现

  1. List<String> phoneNumbers = new ArrayList<>();
  2. phoneNumbers.add("13016541724");
  3. phoneNumbers.add("18826173452");
  4. Map<String, Object> hobbys = new HashMap<>();
  5. hobbys.put("运行", "打羽毛球");
  6. hobbys.put("电影", "看电影");
  7. UserEntity userEntity = UserEntity.builder().username("张三").age(18).department(
  8. Department.builder().depId("djinefn213445nkqk").depName("研发中心").parentId("ncdjkn3j4njndcinw").build()
  9. ).createTime(new Date()).phoneNumber(phoneNumbers).hobby(hobbys)
  10. .build();
  11. ObjectHashMapper objectHashMapper = new ObjectHashMapper();
  12. Map<byte[], byte[]> map = objectHashMapper.toHash(userEntity);
  13. redisTemplate.opsForHash().put("TEST_OBJECT", "a", map);
  14. Map<byte[], byte[]> map1 = (Map<byte[], byte[]>) redisTemplate.opsForHash().get("TEST_OBJECT", "a");
  15. UserEntity userEntityRes = (UserEntity) objectHashMapper.fromHash(map1);

Jackson2HashMapper

Jackson2HashMapper通过使用FasterXMLJackson为域对象提供Redis哈希映射。可以将顶级属性映射为哈希字段名,也可以选择展平结构。简单类型映射到简单值。复杂类型(嵌套对象、集合、映射等)表示为嵌套JSON。Jackson2HashMapper平展为所有嵌套属性创建单独的哈希条目,并尽可能将复杂类型解析为简单类型。

  1. List<String> phoneNumbers = new ArrayList<>();
  2. phoneNumbers.add("13016541724");
  3. phoneNumbers.add("18826173452");
  4. Map<String, Object> hobbys = new HashMap<>();
  5. hobbys.put("运行", "打羽毛球");
  6. hobbys.put("电影", "看电影");
  7. UserEntity userEntity = UserEntity.builder().username("张三").age(18).department(
  8. Department.builder().depId("djinefn213445nkqk").depName("研发中心").parentId("ncdjkn3j4njndcinw").build()
  9. ).createTime(new Date()).phoneNumber(phoneNumbers).hobby(hobbys)
  10. .build();
  11. Jackson2HashMapper jackson2HashMapper = new Jackson2HashMapper(true);
  12. Map<String, Object> map = jackson2HashMapper.toHash(userEntity);
  13. redisTemplate.opsForHash().put("TEST_OBJECT", "a", map);
  14. Map<String, Object> map1 = (Map<String, Object>) redisTemplate.opsForHash().get("TEST_OBJECT", "a");
  15. UserEntity userEntityRes = (UserEntity) jackson2HashMapper.fromHash(map1);

BeanUtilsHashMapper

BeanUtilsHashMapper使用Spring的BeanUtils

  1. List<String> phoneNumbers = new ArrayList<>();
  2. phoneNumbers.add("13016541724");
  3. phoneNumbers.add("18826173452");
  4. Map<String, Object> hobbys = new HashMap<>();
  5. hobbys.put("运行", "打羽毛球");
  6. hobbys.put("电影", "看电影");
  7. UserEntity userEntity = UserEntity.builder().username("张三").age(18).department(
  8. Department.builder().depId("djinefn213445nkqk").depName("研发中心").parentId("ncdjkn3j4njndcinw").build()
  9. ).createTime(new Date()).phoneNumber(phoneNumbers).hobby(hobbys)
  10. .build();
  11. BeanUtilsHashMapper beanUtilsHashMapper = new BeanUtilsHashMapper(UserEntity.class);
  12. Map<String, Object> map = beanUtilsHashMapper.toHash(userEntity);
  13. redisTemplate.opsForHash().put("TEST_OBJECT", "a", map);
  14. Map<String, Object> map1 = (Map<String, Object>) redisTemplate.opsForHash().get("TEST_OBJECT", "a");
  15. UserEntity userEntityRes = (UserEntity) beanUtilsHashMapper.fromHash(map1);

运行会报

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

从报错中可以看出,Listinterface,无法转换。将List改为ArrayList,Map改为HashMap再执行报如下错误

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

排查会发现,phoneNumber的两个手机号码toHash后变成了一个手机号码

这是BeanUtilsHashMapper的一个缺陷。

以上就是将没有实现Serializable的类存储到Redis中方法示例的详细内容,更多关于Redis存储Serializable类的资料请关注w3xue其它相关文章!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号