springcache支持的序列化方式及反序列化失败原因剖析

从接口RedisSerializer我们可以看出,springcache支持的序列化器有StringRedisSerializer,Jackson2JsonRedisSerializer和JdkSerializationRedisSerializer。

springcache支持的序列化方式及反序列化失败原因剖析

 

这些序列化器在底层是如何存储,有什么区别呢,使用中有哪些坑要注意呢?下面开始探索他们的神秘面纱

JacksonJsonRedisSerializer和GenericJackson2JsonRedisSerializer,两者都能系列化成json,但是后者会在json中加入@class属性,类的全路径包名,方便反系列化(json--->user对象过程)。前者如果存放了List则在反系列化的时候如果没指定TypeReference则会报错java.util.LinkedHashMap cannot be cast to 。。。

转载请标明链接:https://blog.csdn.net/wabiaozia/article/details/107134081

打开redis客户端查看存储结果:

JacksonJsonRedisSerializer

springcache支持的序列化方式及反序列化失败原因剖析

GenericJackson2JsonRedisSerializer

springcache支持的序列化方式及反序列化失败原因剖析

所以要注意:使用GenericJackson2JsonRedisSerializer序列化后,如果更改了类的包的路径,反序列化(json--->user对象过程)成对象后会报错。

附一些其他的测试,待验证。

(引自 https://blog.csdn.net/hotdust/article/details/52251148)

我们这里针对StringRedisSerializer,Jackson2JsonRedisSerializer和JdkSerializationRedisSerializer进行测试。

下面是,把3种Serializer保存到Redis中的结果:

1,所有的KeySerializer和HashKeySerializer都使用StringRedisSerializer,用其它Serializer的没有什么意义,就像最上面的例子一样。
2,上面序列化后的值,是保存到redis中的值,从Redis中读取回Java中后,值的内容都是一样的。springcache支持的序列化方式及反序列化失败原因剖析

从上面的结果不难看出,

1,用StringRedisSerializer进行序列化的值,在Java和Redis中保存的内容是一样的

2,用Jackson2JsonRedisSerializer进行序列化的值,在Redis中保存的内容,比Java中多了一对双引号。

3,用JdkSerializationRedisSerializer进行序列化的值,对于Key-Value的Value来说,是在Redis中是不可读的。对于Hash的Value来说,比Java的内容多了一些字符。

(如果Key的Serializer也用和Value相同的Serializer的话,在Redis中保存的内容和上面Value的差异是一样的,所以我们保存时,只用StringRedisSerializer进行序列化)