Is the byte array a result of corresponding serialization for DefaultDeserializer?;EOFException

       异常堆栈信息: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.EOFException:

       场景:jedis是redis的java客户端实现,项目中使用jedis的hincrBy函数实现特定变量的增长:

第一步:redisTemplate.hIncrBy(Constant.SMS_PHONE_PREFIX + tel, Constant.SMS_CHECK_ERROR_COUNT, 1L);

Is the byte array a result of corresponding serialization for DefaultDeserializer?;EOFException_第1张图片

    第二步:我想要获取刚才的特定变量的值,调用

redisTemplate.hGet(Constant.SMS_PHONE_PREFIX + tel, Constant.SMS_CHECK_ERROR_COUNT);

然后就出错了,报错信息为上面红颜色的字体信息。hGet函数中错误的地方如下所示:

Is the byte array a result of corresponding serialization for DefaultDeserializer?;EOFException_第2张图片

      首先调用的hGet函数的返回值不对,其次调错了方法,正确的方法如下:

Is the byte array a result of corresponding serialization for DefaultDeserializer?;EOFException_第3张图片

      最后调用正常返回,再没出现过错误

redisTemplate.getHIncrBy(Constant.SMS_PHONE_PREFIX + tel, Constant.SMS_CHECK_ERROR_COUNT);

      结论:一定要注意调用的api是否对应,hset、hincrBy虽然都可以通过hget获取,但是项目中往往会对jedis的api进行封装,同是hget函数,可以封装为返回值是对象的方法,也可以封装为返回值是基本类型的包装类的方法,再加上封装的时候很可能使用了序列化机制,特别注意要调用对应的方法。

       在我的场景中,我对变量hincrBy时,获取时调用的是反序列化为T类型,而序列化器用的是spring的converter(将byte[]转为object),可能byte[]转string和转long不完全一样,我是这么理解的。对于网上的说的没有配置默认的反序列化器,我的情况并不是这样,只是对返回值处理错误,当然跟序列化肯定是有关系的,只是我的项目已经配了反序列化器,那就是使用错误。

 

     

 

你可能感兴趣的:(redis)