报错提示
org.springframework.data.redis.serializer.serializationexception: cannot deserialize; nested exception is org.springframework.core.serializer.support.serializationfailedexception: failed to deserialize payload. is the byte array a result of corresponding serialization for defaultdeserializer?; nested exception is java.io.streamcorruptedexception: invalid stream header: 3139322e
原因
springboot使用spring-data-redis,redistemplate默认的序列化方式是用org.springframework.data.redis.serializer.jdkserializationredisserializer这个类来做序列化,而redis有自己的序列化方式,所以冲突了 报出了上面的序列化异常的信息。
从redistemplate源码中找到了原因:


解决
在使用到redistemplate的类中加入下面的配置,指定使用的序列化方式:
将key序列化方式改为 stringredisserializer,将value序列化方式改为 genericjackson2jsonredisserializer 。
private redistemplate<string, questiontemplate> redistemplate;
//指定用redis的序列化方式进行序列化
@autowired(required = false)
public void setredistemplate(redistemplate redistemplate) {
redisserializer stringserializer = new stringredisserializer();//序列化为string
//不能反序列化
//jackson2jsonredisserializer jackson2jsonredisserializer = new jackson2jsonredisserializer(object.class);//序列化为json
genericjackson2jsonredisserializer serializer = new genericjackson2jsonredisserializer();
redistemplate.setkeyserializer(stringserializer);
redistemplate.setvalueserializer(serializer);
redistemplate.sethashkeyserializer(stringserializer);
redistemplate.sethashvalueserializer(serializer);
this.redistemplate = redistemplate;
}
注意:
jackson2jsonredisserializer可以序列化成功,但是反序列化会失败,所以建议用genericjackson2jsonredisserializer即可序列化也可反序列化。
1、由jackson2jsonredisserializer 序列化产生的格式:

2、由genericjackson2jsonredisserializer 序列化产生的格式:

由序列化冲突导致的问题有
1、redis数据库有值, 但是用redistemplate根据key获取value值为 null
2、存入redis数据库中字符乱码,字符串前缀出现\xac\xed\x00\x05t\x00\x10(但是不影响读写)
3、序列化和反序列化失败
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论