博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis 自定义对象 cannot be cast to java.lang.String
阅读量:6975 次
发布时间:2019-06-27

本文共 3931 字,大约阅读时间需要 13 分钟。

Redis序列化对象的时候报错如下

java.lang.ClassCastException: com.ppdai.cbd.ddp.thirdparty.contract.bhxtzx.BHXTZXTask cannot be cast to java.lang.String        at org.springframework.data.redis.serializer.StringRedisSerializer.serialize(StringRedisSerializer.java:33)        at org.springframework.data.redis.core.AbstractOperations.rawValue(AbstractOperations.java:117)        at org.springframework.data.redis.core.DefaultListOperations.leftPush(DefaultListOperations.java:71)        at org.springframework.data.redis.core.DefaultBoundListOperations.leftPush(DefaultBoundListOperations.java:60)        at com.ppdai.realtime.datachannel.pullservice.entity.RedisQueue.pushFromHead(RedisQueue.java:63)        at com.ppdai.realtime.datachannel.pullservice.redisconfig.RedisTaskSender.sendTask(RedisTaskSender.java:35)        at com.ppdai.realtime.datachannel.pullservice.redisconfig.RedisTaskSender$sendTask.call(Unknown Source)        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
BHXTZXTask是自己定义的Bean,因此问题就变成了自定义的对象不能转成String对象,为什么会需要转成String对象呢

因为redis默认使用jdkSerializer,看RedisTemplate的代码如下,

afterPropertiesSet函数
public class RedisTemplate
extends RedisAccessor implements RedisOperations
, BeanClassLoaderAware { public void afterPropertiesSet() { super.afterPropertiesSet(); boolean defaultUsed = false; if (defaultSerializer == null) { defaultSerializer = new JdkSerializationRedisSerializer( classLoader != null ? classLoader : this.getClass().getClassLoader()); } if (enableDefaultSerializer) { if (keySerializer == null) { keySerializer = defaultSerializer; defaultUsed = true; } if (valueSerializer == null) { valueSerializer = defaultSerializer; defaultUsed = true; } if (hashKeySerializer == null) { hashKeySerializer = defaultSerializer; defaultUsed = true; } if (hashValueSerializer == null) { hashValueSerializer = defaultSerializer; defaultUsed = true; } } if (enableDefaultSerializer && defaultUsed) { Assert.notNull(defaultSerializer, "default serializer null and not all serializers initialized"); } if (scriptExecutor == null) { this.scriptExecutor = new DefaultScriptExecutor
(this); } initialized = true; }}

 

查看源码,如下,通过rawValue()函数获取序列化之后的字节码

public Long leftPush(K key, V value) {        final byte[] rawKey = rawKey(key);        final byte[] rawValue = rawValue(value);        return execute(new RedisCallback
() { public Long doInRedis(RedisConnection connection) { return connection.lPush(rawKey, rawValue); } }, true); }
private byte[] rawValue(Object value) {
if (valueSerializer == null && value instanceof byte[]) {
return (byte[]) value; } return valueSerializer.serialize(value); }
 

通过 valueSerializer序列化来序列化对象, redis如果不配置,默认 valueSerializer的序列化是会使用

StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();        JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();        System.out.println(redisTemplate.hasKey("bohai_credit"));        redisTemplate.delete("bohai_credit");        System.out.println(stringRedisSerializer.serialize("bohai_credit"));        System.out.println(jdkSerializationRedisSerializer.serialize("bohai_credit"));
[B@21831984[B@4488db1f

运行结果如上所示。

转载于:https://www.cnblogs.com/zhengwangzw/p/9965406.html

你可能感兴趣的文章
route命令相关整理
查看>>
关于VS2012如何安装Windows Phone Toolkit
查看>>
Forefront for OCS2007之部署
查看>>
IBM Thinkpad T43-44U 升级到 2G 内存后少了 66M
查看>>
【No.1_sizeof与strlen】
查看>>
SMO学习笔记(二)——还原(恢复)篇之完整恢复
查看>>
Windows Server 2003 AD升级到Windows Server 2008 AD的方法及详细步骤
查看>>
设置php-fpm使用socket文件
查看>>
用 Label 控制 Service 的位置 - 每天5分钟玩转 Docker 容器技术(106)
查看>>
Android美工坊:Selector选择器的使用
查看>>
Nginx&Apache&PHP参数汇总
查看>>
Android重绘ListView高度
查看>>
centos6 防火墙iptables操作整理
查看>>
Android 中文 API (25) —— ZoomControls
查看>>
转载:python原生态的输入窗口抖动+输入特效
查看>>
给 Windows 驱动程序安装提速
查看>>
提高mysql性能的开源软件
查看>>
ExtJs 备忘录(3)—— Form表单(三) [ 数据验证 ]
查看>>
Python网络编程Socket应用实例
查看>>
2015香港书展
查看>>