如何将没有实现Serializable的类存储到Redis中
导读:本文共3597字符,通常情况下阅读需要12分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 将实例对象存储到Redis中报错你有没有遇到过这种情况,需要将实例对象存储到Redis中,但是类的字段包含第三方依赖中的类并且此类没有 implements Serializable。 执行时就会报没有序列化的错:Causedby:java.lang.IllegalArgumentException:DefaultSerializerrequiresaSeria... ...
目录
(为您整理了一些要点),点击可以直达。将实例对象存储到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
从报错中可以看出,List
为interface
,无法转换。将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后变成了一个手机号码
这是BeanUtilsHashMapper
的一个缺陷。
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
如何将没有实现Serializable的类存储到Redis中的详细内容,希望对您有所帮助,信息来源于网络。