fastjson.support.spring.FastJsonRedisSerializer序列化问题

e0bqpujr  于 2021-11-27  发布在  Java
关注(0)|答案(8)|浏览(325)

搜索引擎查了很多~但是英文不太好所以没找到答案,所以想请教下各位大牛。

使用redis的时候,设定序列化方式为fastjson。之前用的是网上参考来的方法,serialize()实现是JSON.toJSONString().getBytes();然后最近重新弄得时候看到官方依赖(1.2.35后)有提供.FastJsonRedisSerializer,其中serialize()实现是JSON.toJSONBytes();

问题来了:第一种方法序列化后会有@type属性,反序列化的时候可以直接强转;但是JSON.toJSONBytes()并没有@type属性,然后强转会报错。

现在使用springcache拿缓存的时候就会报转换类型错误,当然换回原先方法没有问题,但是有点强迫症~

whhtz7ly

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

bqujaahr

bqujaahr3#

2083 (comment)

这个回答里面提到FastJsonRedisSerializer反序列化过来对象为JSONObject,建议你自己再转换一次
但是反序列化的方法不是已经有泛型了?为什么还要再重复的转换一次呢?官方都没有好的解决方案吗?

9njqaruj

9njqaruj4#

上面序列化后出现@type是因为我用网上的方法手动实现了serialize和deserialize方法
如果用fastjson默认的方法的话 序列化后是没有这个@type的。

vawmfj5a

vawmfj5a5#

测试了几次 好像用GenericFastJsonRedisSerializer可以正常序列化跟反序列化 会把@type写入。但是格式上不如GenericJackson2JsonRedisSerializer,有class类型 字段也是有序的。GenericFastJsonRedisSerializer如果有Double类型的字段的话 序列化后不能按照json格式化,因为数字后有D。但是不影响反序列化。

ifsvaxew

ifsvaxew6#

@lihengming 麻烦看一下

kb5ga3dv

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

相关问题