alibaba / jetcache

JetCache is a Java cache framework.
Apache License 2.0
5.03k stars 1.05k forks source link

如何自定义序列化和反序列化 #847

Open luger1990 opened 8 months ago

luger1990 commented 8 months ago

我还是想用fastjson2进行value的序列化和反序列化,但是想存redis之前对value进行gzip压缩,减小数据的体积。但是看了看文档没有找到自定义序列化和反序列化的完整代码。麻烦给个步骤。 同时也问问有没有人是用gzip压缩的。效果好不好。不考虑kryo的原因是 如果新增 减少字段 kryo会报错。

dantefung commented 6 months ago
  1. 实现SerialPolicy接口 比如 TestPolicy

  2. 注册Bean @Bean(name = "testPolicy") public SerialPolicy testPolicy() { // 省略 return testPolicy; }

  3. 配置 ,格式:valueEncoder: bean:testPolicy jetcache: statIntervalMinutes: 15 areaInCacheName: false local: default: type: linkedhashmap keyConvertor: fastjson remote: test: type: redisson valueEncoder: bean:testPolicy valueDecoder: bean:testPolicy

dantefung commented 6 months ago

我还是想用fastjson2进行value的序列化和反序列化,但是想存redis之前对value进行gzip压缩,减小数据的体积。但是看了看文档没有找到自定义序列化和反序列化的完整代码。麻烦给个步骤。 同时也问问有没有人是用gzip压缩的。效果好不好。不考虑kryo的原因是 如果新增 减少字段 kryo会报错。

源码参见:
com.alicp.jetcache.autoconfigure.JetCacheAutoConfiguration#springConfigProvider com.alicp.jetcache.anno.support.SpringConfigProvider com.alicp.jetcache.anno.support.DefaultSpringEncoderParser com.alicp.jetcache.anno.support.DefaultSpringEncoderParser#parseBeanName

com.alicp.jetcache.anno.support.ConfigProvider#doInit

wyc9512 commented 5 months ago

api模式: //初始化任务图相关数据的缓存配置 QuickConfig graphQc = QuickConfig.newBuilder(JetCacheConstant.PUBLISH_GRAPH_CACHE_NAME) .expire(Duration.ofDays(PUBLISH_DATA_EXPIRE_TIME)) .cacheType(CacheType.BOTH) // 本地缓存更新后,将在所有的节点中删除缓存,以保持强一致性 .valueDecoder(bytes -> GzipUtils.unGzip(new String(bytes, StandardCharsets.UTF_8))) .valueEncoder(obj -> { String gzip = GzipUtils.gzip(JSONObject.toJSONString(obj)); return gzip.getBytes(); }) .syncLocal(false) .build(); 使用起来感觉还行

Skqing commented 3 months ago

fastjson2编码器/解码器已实现,但默认情况下不注册。这是因为json不是java的良好序列化util,并且有许多兼容问题

Skqing commented 3 months ago

fastjson2的序列化器已经完成。

json不是专门的java序列化工具,无论用用哪个json类库,兼容性问题都很多。java中反序列化特别容易导致严重的安全问题,而json字符串通常又是从不受信任的前端传进来的,导致json类库安全漏洞特别多,为了修这些漏洞,各个json类库都变得特别保守,比如只要类型不确定,就序列化为一个JsonObject,而不是序列化时的那个java对象。在jetcache里面,会导致反序列化的时候出现各种问题。

综上考虑,2.7代码里面虽包含fastjson2的Encoder/Decoder实现,但默认不注册任何json序列化器。如果有人需要用,自己搞定注册事宜(要是搞不定这个你也搞不定反序列化时出现的各种问题,也就没必要用了)。

Skqing commented 3 months ago

https://github.com/alibaba/jetcache/issues/680