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类型等可能会出现问题

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐