搜索引擎查了很多~但是英文不太好所以没找到答案,所以想请教下各位大牛。
使用redis的时候,设定序列化方式为fastjson。之前用的是网上参考来的方法,serialize()实现是JSON.toJSONString().getBytes();然后最近重新弄得时候看到官方依赖(1.2.35后)有提供.FastJsonRedisSerializer,其中serialize()实现是JSON.toJSONBytes();
问题来了:第一种方法序列化后会有@type属性,反序列化的时候可以直接强转;但是JSON.toJSONBytes()并没有@type属性,然后强转会报错。
现在使用springcache拿缓存的时候就会报转换类型错误,当然换回原先方法没有问题,但是有点强迫症~
8条答案
按热度按时间nwsw7zdq1#
同问题
whhtz7ly2#
同问,困扰很久了。我是集成的spring-data-redis.也是使用的FastJsonRedisSerializer序列化。
存进redis的时候序列化看起来没什么问题。存的也是json格式。
同样的我用opsForList获取列表好像就没什么转换的问题。
使用opsForValue获取存进去的对象就会报错ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to XXX。
莫名其妙的 一直疑问 都快放弃使用FastJsonRedisSerializer了。网上也一直找不到正确的解决方案。看git好像也没人解决这个问题。
也不想像网上别人说的那样去手动写一个FastJsonRedisSerializer的serialize和deserialize方法。我看现在这个版本已经内置了这两个方法,所以就想直接用的。我fastjson的版本是1.2.51
bqujaahr3#
2083 (comment)
这个回答里面提到FastJsonRedisSerializer反序列化过来对象为JSONObject,建议你自己再转换一次
但是反序列化的方法不是已经有泛型了?为什么还要再重复的转换一次呢?官方都没有好的解决方案吗?
9njqaruj4#
上面序列化后出现@type是因为我用网上的方法手动实现了serialize和deserialize方法
如果用fastjson默认的方法的话 序列化后是没有这个@type的。
vawmfj5a5#
测试了几次 好像用GenericFastJsonRedisSerializer可以正常序列化跟反序列化 会把@type写入。但是格式上不如GenericJackson2JsonRedisSerializer,有class类型 字段也是有序的。GenericFastJsonRedisSerializer如果有Double类型的字段的话 序列化后不能按照json格式化,因为数字后有D。但是不影响反序列化。
ifsvaxew6#
@lihengming 麻烦看一下
kb5ga3dv7#
see https://github.com/alibaba/fastjson/wiki/%E5%9C%A8-Spring-%E4%B8%AD%E9%9B%86%E6%88%90-Fastjson#%E5%9C%A8-spring-data-redis-%E4%B8%AD%E9%9B%86%E6%88%90-fastjson
hs1ihplo8#
fixed by #2153