文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何将没有实现Serializable的类存储到Redis中

2023-07-05 00:04

关注

这篇文章主要讲解了“如何将没有实现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@NoArgsConstructorpublic 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@AllArgsConstructorpublic class Department {        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.Listat 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.ArrayListat 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中这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯