Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
luger1990 opened this issue Jan 2, 2024 · 6 comments
Open

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

luger1990 opened this issue Jan 2, 2024 · 6 comments

Comments

@luger1990
Copy link

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

@dantefung
Copy link

  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
Copy link

我还是想用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
Copy link

wyc9512 commented Mar 28, 2024

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
Copy link

Skqing commented May 20, 2024

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

@Skqing
Copy link

Skqing commented May 20, 2024

fastjson2的序列化器已经完成。

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

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

@Skqing
Copy link

Skqing commented May 20, 2024

#680

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants