如何将没有实现Serializable的类存储到Redis中(redis,serializable,开发技术)

时间:2024-05-03 02:26:18 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

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

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

Causedby:java.lang.IllegalArgumentException:DefaultSerializerrequiresaSerializablepayloadbutreceivedanobjectoftype[com.entity.UserEntity] atorg.springframework.core.serializer.DefaultSerializer.serialize(DefaultSerializer.java:43) atorg.springframework.core.serializer.Serializer.serializeToByteArray(Serializer.java:56) atorg.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:60) ...54more

有三种方法如下

ObjectHashMapper

ObjectHashMapper使用对象到哈希映射。

需存redis的类如下:

用户类

@Data@Builder@AllArgsConstructor@NoArgsConstructorpublicclassUserEntity{/***用户名*/privateStringusername;/***年龄*/privateIntegerage;/***所属部门*/privateDepartmentdepartment;/***创建时间*/privateDatecreateTime;/***手机号码*/privateList<String>phoneNumber;/***爱好*/privateMap<String,Object>hobby;}

部门类

@Data@Builder@NoArgsConstructor@AllArgsConstructorpublicclassDepartment{/***部门id*/privateStringdepId;/***部门名称*/privateStringdepName;/***父级部门*/privateStringparentId;}

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

通过ObjectHashMapper的toHash和fromHash实现

List<String>phoneNumbers=newArrayList<>();phoneNumbers.add("13016541724");phoneNumbers.add("18826173452");Map<String,Object>hobbys=newHashMap<>();hobbys.put("运行","打羽毛球");hobbys.put("电影","看电影");UserEntityuserEntity=UserEntity.builder().username("张三").age(18).department(Department.builder().depId("djinefn213445nkqk").depName("研发中心").parentId("ncdjkn3j4njndcinw").build()).createTime(newDate()).phoneNumber(phoneNumbers).hobby(hobbys).build();ObjectHashMapperobjectHashMapper=newObjectHashMapper();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");UserEntityuserEntityRes=(UserEntity)objectHashMapper.fromHash(map1);

Jackson2HashMapper

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

List<String>phoneNumbers=newArrayList<>();phoneNumbers.add("13016541724");phoneNumbers.add("18826173452");Map<String,Object>hobbys=newHashMap<>();hobbys.put("运行","打羽毛球");hobbys.put("电影","看电影");UserEntityuserEntity=UserEntity.builder().username("张三").age(18).department(Department.builder().depId("djinefn213445nkqk").depName("研发中心").parentId("ncdjkn3j4njndcinw").build()).createTime(newDate()).phoneNumber(phoneNumbers).hobby(hobbys).build();Jackson2HashMapperjackson2HashMapper=newJackson2HashMapper(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");UserEntityuserEntityRes=(UserEntity)jackson2HashMapper.fromHash(map1);

BeanUtilsHashMapper

BeanUtilsHashMapper使用Spring的BeanUtils。

List<String>phoneNumbers=newArrayList<>();phoneNumbers.add("13016541724");phoneNumbers.add("18826173452");Map<String,Object>hobbys=newHashMap<>();hobbys.put("运行","打羽毛球");hobbys.put("电影","看电影");UserEntityuserEntity=UserEntity.builder().username("张三").age(18).department(Department.builder().depId("djinefn213445nkqk").depName("研发中心").parentId("ncdjkn3j4njndcinw").build()).createTime(newDate()).phoneNumber(phoneNumbers).hobby(hobbys).build();BeanUtilsHashMapperbeanUtilsHashMapper=newBeanUtilsHashMapper(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");UserEntityuserEntityRes=(UserEntity)beanUtilsHashMapper.fromHash(map1);

运行会报

Causedby:org.apache.commons.beanutils.ConversionException:Can'tconvertvalue''totypeinterfacejava.util.List atorg.apache.commons.beanutils.converters.AbstractConverter.conversionException(AbstractConverter.java:474) atorg.apache.commons.beanutils.converters.StringConverter.convertToType(StringConverter.java:96) atorg.apache.commons.beanutils.converters.AbstractConverter.handleMissing(AbstractConverter.java:312) ...58more

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

Causedby:org.apache.commons.beanutils.ConversionException:Can'tconvertvalue''totypeclassjava.util.ArrayList atorg.apache.commons.beanutils.converters.AbstractConverter.conversionException(AbstractConverter.java:474) atorg.apache.commons.beanutils.converters.StringConverter.convertToType(StringConverter.java:96) atorg.apache.commons.beanutils.converters.AbstractConverter.handleMissing(AbstractConverter.java:312) ...58more

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

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

这是BeanUtilsHashMapper的一个缺陷。

 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:如何将没有实现Serializable的类存储到Redis中的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:vue如何使用反向代理解决跨域问题下一篇:

10 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18