RedisTemplate SerializationFailedException: Failed to deserialize payload 异常解决

问题描述:

   使用RedisTemplate(spring-data-redis )进行redis操作的封装 , 现有一个incr的key , 当调用incr后返回值一切正常, 当对此key进行get调用的时候出现了如下的异常:

   

 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
	at org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.deserialize(JdkSerializationRedisSerializer.java:42)
	at org.springframework.data.redis.core.AbstractOperations.deserializeValue(AbstractOperations.java:274)
	at org.springframework.data.redis.core.AbstractOperations$ValueDeserializingRedisCallback.doInRedis(AbstractOperations.java:52)
	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:185)
	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:153)
	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:86)
	at org.springframework.data.redis.core.DefaultValueOperations.get(DefaultValueOperations.java:43)
	at org.springframework.data.redis.core.DefaultBoundValueOperations.get(DefaultBoundValueOperations.java:42)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
	at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436)
	at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:900)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
	
Caused by: 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
	at org.springframework.core.serializer.support.DeserializingConverter.convert(DeserializingConverter.java:61)
	at org.springframework.core.serializer.support.DeserializingConverter.convert(DeserializingConverter.java:1)
	at org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.deserialize(JdkSerializationRedisSerializer.java:40)
	... 38 more
Caused by: java.io.EOFException
	at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
	at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source)
	at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
	at java.io.ObjectInputStream.<init>(Unknown Source)
	at org.springframework.core.serializer.DefaultDeserializer.deserialize(DefaultDeserializer.java:38)
	at org.springframework.core.serializer.support.DeserializingConverter.convert(DeserializingConverter.java:58)
	... 40 more
   可以看出是sping对redis查询的返回结果进行deserialize的时候出错了 , 当然异常的提示也很明确:序列号对象生成这个字节数组的方法是否与默认的反序列化方法相对应;应该就是对称性吧 , 你用A方法对B进行序列号然后用不对称的反序列化方法C进行反序列号 , 肯定会有问题 , 结果在国外大神的回复中找到了答案:

     

        提简单来说调用incr后得到 值不会出错是没有经过redistemplate的deserialize, 而get必须经过 , 所以只要设置redistemplate的ValueSerializer即可:

       

    redisTemplate.setValueSerializer(new GenericToStringSerializer<Long>(Long.class));

补充说明: 经过几天的学习发现这个异常只需要配置RedisTemplate的几个属性就可以了:
	
                <property name="keySerializer">
			<bean
				class="org.springframework.data.redis.serializer.StringRedisSerializer" />
		</property>
		<property name="valueSerializer">
			<bean
				class="org.springframework.data.redis.serializer.StringRedisSerializer" />
		</property>


这样不仅可以解决redis中key前面奇葩的字符形如:\xac\xed\x00\x05t\x00\x10 ,这就是默认keySerializer导致的,其它同理

     


  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 无法反序列化;嵌套异常为org.springframework.core.serializer.support.SerializationFailedException:反序列化负载失败。字节数组是否是由DefaultDeserializer对应序列化的?;嵌套异常java.i。 ### 回答2: 这个错误是由于进行反序列化时,Spring框架无法将字节数组转换回对象,而在具体的错误信息中,出现了“org.springframework.core.serializer.support.serializationfailedexception: failed to deserialize payload”的提示,这意味着在序列化和反序列化工作时,数据包的传输出现了问题。 而后面的“is the byte array a result of corresponding serialization for defaultdeserializer?”提示,提醒我们需要确认字节数组是否是由默认反序列化器(defaultdeserializer)所对应的序列化方式生成的。如果不是,则有可能使用了不同的序列化方式,导致反序列化失败。 至于后面的“java.io”错误,可能是由于数据包在传输过程中出现了异常,导致反序列化工作无法正常进行。 针对这个错误,我们可以先检查数据包的来源和内容,确认数据包是否符合预期的序列化方式。同时,也可以检查程序中是否存在其他异常情况(如IO异常)导致反序列化失败。若问题无法解决,可以考虑使用其他的序列化方式。 ### 回答3: 这个错误提示说明反序列化失败,因为该字节数组不是由默认反序列化器所序列化的结果。具体来说,当我们将一个对象序列化成字节数组时,可以使用不同的序列化器,比如 Java 默认的序列化器或者 Spring 提供的序列化器。 如果使用的反序列化器与序列化器不匹配,那么就会出现反序列化失败的情况。 在 Spring 应用程序中,通常使用 JMS(Java Message Service)或者消息队列将消息发送到不同的应用程序。对于这些消息,我们通常使用 Spring 提供的序列化器将它们序列化成字节数组格式,然后发送到消息队列或者 JMS 服务器中。接收方处理消息时,需要使用相同类型的反序列化器进行反序列化。 如果在反序列化时出现了上述错误提示,则需要确认序列化器和反序列化器是否匹配。如果不匹配,则需要使用相应的反序列化器进行反序列化操作,以避免序列化和反序列化导致的数据错误或者程序崩溃情况的出现。 总之,遇到反序列化失败的情况,需要仔细检查序列化器和反序列化器之间的匹配情况,并根据错误提示进行适当的操作来解决问题。同时,我们还需要注意在实际应用程序中使用合适的序列化器和反序列化器,以确保数据的准确传输和处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值