redis反序列化报错原因分析以及解决方案

目录
  • redis反序列化报错原因分析
    • 序列化id’不一致
    • 实体类属性不一致
  • redis序列化转换类型报错
  • 总结

redis反序列化报错原因分析

问题:Cannot deserialize,无法反序列化

分析:

序列化id’不一致

1、实体类实现了序列化接口后,没有指定序列化id。

2、读和写的class版本不一致,srpingboot jar包版本不一致的两个class文件,序列化id不一致。因为我们项目是几个系统对接,共享的一个redis库。

实体类属性不一致

可能存到redis的时候是两个属性,但是我们本地业务扩展,新增了一些字段,也是无法完成反序列的。这个时候需要及时清理掉缓存库

解决方案:

  • 指定序列化id
  • 统一jar包版本
  • 清除redis库

redis序列化转换类型报错

Cannot convert value of type 'org.springframework.data.redis.core.convert.MappingRedisConverter' to required type 'org.springframework.data.redis.core.mapping.RedisMappingContext': no matching editors or conversion strategy found

在setValue的序列化方式的时候报错,原来是用的RedisSerializer.json()方法,但是报错,

template.setConnectionFactory(factory);
        // key序列化方式
        template.setKeySerializer(RedisSerializer.string());
        // value序列化方式
        template.setValueSerializer(RedisSerializer.json());
        // hash key的序列化方式
        template.setHashKeySerializer(RedisSerializer.string());
        // hash value的序列化方式
        template.setHashValueSerializer(RedisSerializer.json());

改成如下即可解决:

template.setConnectionFactory(factory);
        // key序列化方式
        template.setKeySerializer(RedisSerializer.string());
        // value序列化方式
        template.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
        // hash key的序列化方式
        template.setHashKeySerializer(RedisSerializer.string());
        // hash value的序列化方式
        template.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));

在Redis中,有多种序列化实现可供选择。其中,Jackson2JsonRedisSerializer和RedisSerializer.json()都是Redis中的序列化实现。

它们的区别如下:

Jackson2JsonRedisSerializer使用Jackson库将Java对象序列化为JSON格式的字符串,并将其存储到Redis中。它还可以将从Redis中读取的JSON字符串反序列化为Java对象。

因此,使用Jackson2JsonRedisSerializer可以方便地处理JSON格式的数据,并且对于复杂的Java对象可以进行较好的序列化和反序列化。

但是,它可能会在序列化过程中忽略一些Java对象中的字段,因此需要进行一些配置才能完全控制序列化过程。

RedisSerializer.json()使用Redis的内置JSON序列化器,将Java对象序列化为JSON格式的字符串,并将其存储到Redis中。它也可以将从Redis中读取的JSON字符串反序列化为Java对象。

与Jackson2JsonRedisSerializer相比,RedisSerializer.json()在序列化过程中会将所有Java对象中的字段都序列化到Redis中,但在处理复杂Java对象时,可能需要进行一些额外的配置。

因此,选择哪种序列化方式取决于使用场景和具体需求。如果需要处理复杂的Java对象,并且对序列化和反序列化的精细控制比较关键,那么Jackson2JsonRedisSerializer是一个更好的选择。

而如果处理的数据较为简单,或者只需要简单地将Java对象转换为JSON格式的字符串进行存储,那么RedisSerializer.json()可能更适合。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Redis Hash序列化存储的问题及解决方案

    目录 SDR序列化方式有多种 对Redis的存储设置是我自己写的 更改序列化方法 更改序列化方式 继续使用JdkSerializationRedisSerializer 这里说的是Spring Data Redis(一下简称SDR)设置Hash存储的序列化. SDR序列化方式有多种 如: StringRedisSerializer JdkSerializationRedisSerializer Jackson2JsonRedisSerializer OxmSerializer 等等 目前我有个需

  • Redis存取序列化与反序列化性能问题详解

    1. 问题场景 我们在使用Redis的时候经常会将对象序列化存储到Redis中,在取出的时候进行反序列化,如果对象过大在进行序列化和反序列化的时候会有一定性能问题.今天查看了CSRedis源码发现在Set和Get的时候是支持Byte[]类型,那么问题来了如果我们将对象转换成Byte[]类型进行存储是否会比序列化和反序列化操作快了? 2. 问题验证 2.1. 编写一个简单实例进行验证 List<User> list = new List<User>(); for (int i = 0

  • Redis之RedisTemplate配置方式(序列和反序列化)

    RedisTemplate配置 序列和反序列化 对于redis操作,springboot进行了很好的封装,那就是spring data redis.提供了一个高度封装的RedisTemplate类来进行一系列redis操作,连接池自动管理:同时将事务封装操作,交由容器进行处理. 针对数据的“序列化和反序列化”,提供了多种策略(RedisSerializer) 默认为使用JdkSerializationRedisSerializer,同时还有StringRedisSerializer,Jackso

  • Java @Autowired报错原因分析和4种解决方案

    目录 报错原因分析 解决方案1:关闭报警机制 解决方案2:添加Spring注解 解决方案3:允许注入对象为NULL 解决方案4:使用@Resource注解 总结 前言: 上图的报错信息相信大部分程序员都遇到过,奇怪的是虽然代码报错,但丝毫不影响程序的正常执行,也就是虽然编译器 IDEA 报错,但程序却能正常的执行,那这其中的原因又是为何? 报错原因分析 报错的原因首先是因为 IDEA 强大的报警机制,@Autowired 为 Spring 的注解,含义是将某类动态的注入到当前类中, 如下图所示:

  • Flex读取txt文件中的内容报错原因分析及解决

    Flex读取txt文件中的内容 1.具体错误如下  2.错误原因 读取文件不存在 复制代码 代码如下: var file:File = new File(File.applicationDirectory.nativePath+"/phone.txt"); 3.解决办法 将文件导入进去

  • android4.0混淆XmlPullParser报错原因分析解决

    复制代码 代码如下: [2013-05-20 17:30:52 - danielinbiti] Proguard returned with error code 1. See console [2013-05-20 17:30:52 - danielinbiti] Note: there were 67 duplicate class definitions. [2013-05-20 17:30:52 - danielinbiti] Warning: library class android

  • ubuntu16.04下vim安装失败的原因分析及解决方案

    先给大家说下问题描述? 重装了ubuntu系统,安装vim出现了以下问题: sudo apt-get install vim 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 有一些软件包无法被安装.如果您用的是 unstable 发行版,这也许是 因为系统无法达到您要求的状态造成的.该版本中可能会有一些您需要的软件 包尚未被创建或是它们已被从新到(Incoming)目录移出. 下列信息可能会对解决问题有所帮助: 下列软件包有未满足的依赖关系: vim :

  • JQuery EasyUI 加载两次url的原因分析及解决方案

    1.传统方式 <span style="font-size:18px;">$(function () { var url = "../Source/Query/jhDataQry.ashx?action=query"; $(dg).datagrid({ url: url, queryParams: { qsrq: qsrq, zzrq: zzrq } }); }) <table id="DataGrid" class="

  • 阿里云镜像安装docker报错的问题及解决方案

    问题 使用阿里云镜像安装docker时出现如下报错,具体如下图: Malformed entry 60 in list file /etc/apt/sources.list (Component) 解决方案 注意到报错提示/etc/apt/sources.list 这个文件第60行格式错误,那么尝试把这行注释掉.先打开这个文件: $ sudoedit /etc/apt/sources.list 再使用vim的语法进入编辑模式后,找到第60行的 deb [arch=amd64] https://d

  • VS Code安装go插件失败原因分析以及解决方案

    目录 问题背景 问题原因 解决方案 方案1:快速方案 方案2:环境变量中配置 方案3:vscode中配置 总结 问题背景 VSCode是我们开发go程序的常用工具,但是安装VSCode成功后,创建一个.go文件会有如下提示: 这个是vscode提示你需要安装go插件,但是当你点击install all进行安装时,发现会安装失败. Installing 8 tools at D:\pragrams\go\bin  gocode  gopkgs  go-outline  go-symbols  dl

  • 解决java.lang.NullPointerException报错以及分析出现的几种原因

    java.lang.NullPointerException出现的几种原因: 1.字符串变量未初始化 2.接口类型的对象没有用具体的类初始化,比如: Map map // 会报错 Map map = new Map(); //则不会报错了 3.当一个对象的值为空时,你没有判断为空的情况. 4.字符串与文字的比较,文字可以是一个字符串或Enum的元素,如下会出现异常 String str = null; if(str.equals("Test")){ //这里的代码将不会被触发,因为会抛

  • HipChat上传文件报未知错误的原因分析及解决方案

    HipChat的功能类似于Campfire.Sazneo等在线协同工具,并且和Yammer以及Salesforce的Chatter等企业社交平台有一定相似之处.你可以为单个项目或者小组搭建自有的聊天室,也可以很方便的发起一对一聊天.这套 IM 系统还整合了团队文件管理和分享,拖拽就能完成保存操作. 前言 HipChat是Atlassian公司的一款团队协作即时通讯工具,服务端为Linux(官方给的服务端就是一个虚拟机),在Windows.Linux.Android.IOS.Mac等平台都有客户端

  • 微信小程序 HTTPS报错整理常见问题及解决方案

    微信小程序 HTTPS报错常见问题及解决方案 微信小程序开放公测已经一个多月了,因官方需求文档要求后台使用HTTPS请求进行网络通信,不满足条件的域名和协议无法请求.越来越多的开发者纷纷使用SSL证书实践微信小程序的应用情况,但仍然会碰到各类问题.本文列举了SSL证书常见的报错和解决办法,供开发者参考. 常见问题一 在微信小程序内测的过程中,几乎每个开发者们在实践的过程中都遇到了下图的报错: 原因及解决办法: 这是因为wx.request 发起的是 https 请求,微信小程序读取大部分是请求A

随机推荐

其他