Redis从入门到放弃 之 序列化和反序列化的问题

up-5fce7c659f69edc8b22f5d80a0b1a24667b.png

这两天项目上遇到了点问题,系统A调用RPC将字典信息 存储到了Redis集群中,此时系统B也需要用到字典表。
就想着直接从Redis里取得了,然后反序列化的时候就遇到了上诉问题。

在这里总结一下
一、原因:
Redis客户端未指定序列化的方式,默认为JdkSerializationRedisSerializer序列化操作

JdkSerializationRedisSerializer:这个在多项目中反序列化会出现一个问题,反序列化的对象Bean必须与序列化对象是相同的包名才能匹配,不然出现上述问题。

二、解决方案:
1、建立相同包名的对象
2、改变序列化方式

三、Redis目前支持的序列化方式

1、JdkSerializationRedisSerializer
序列化java对像的、被序列化的对象必须实现Serializable接口
在存储内容时,除了属性的内容外还存了其它内容在里面,总长度长,且不容易阅读
跨项目使用比较容易出现问题,两边对象必须具有相同的包名
他存储的为二进制数据,这对开发者是不友好的

2、GenericJackson2JsonRedisSerializer(不用指定class类型)、JacksonJsonRedisSerializer类似
序列化object对象为json字符串并保存到redis中,但需要和jackson配合一起使用
被序列化的对象不用实现Serializable接口
Jackson是利用反射和getter和setter方法进行读取的,如果不想因为getter和setter方法来影响存储,就要使用注解来定义被序列化的对象。
Jackson序列化的结果清晰,容易阅读,而且存储字节少,速度快,推荐。
问题:对于LocalDate等一些不太支持会报错
还有那就是此类的构造函数中有一个类型参数,必须提供要序列化对象的类型信息(.class对象)。 通过查看源代码,发现其在反序列化过程中用到了类型信息(必须根据此类型信息完成反序列化)
GenericJackson2JsonRedisSerializer会将属性对象转化为Object,在反序列化时会出现转化问题

3、StringRedisSerializer
简单的字符串序列化,本源所在
不能序列化Bean,只能序列化字符串类型的数据

4、GenericFastJsonRedisSerializer
主要是利用了阿里爸爸的FastJson做转化,会更快
FastJsonRedisSerializer需要指定反序列化类型,而GenericFastJsonRedisSerializer则比较通用
处理List、Set、Long类型等可能会出现问题

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值