KCloud-Platform-IoT KCloud-Platform-IoT
首页
  • 开发手册

    • 组件【ai】
    • 组件【algorithm】
    • 组件【banner】
    • 组件【core】
    • 组件【bom】
    • 组件【cors】
    • 组件【domain】
    • 组件【crypto】
    • 组件【data-cache】
    • 组件【elasticsearch】
    • 组件【excel】
    • 组件【i18n】
    • 组件【idempotent】
    • 组件【influxdb】
    • 组件【kafka】
    • 组件【log】
    • 组件【lock】
    • 组件【mail】
    • 组件【log4j2】
    • 组件【mqtt】
    • 组件【mybatis-plus】
    • 组件【nacos】
    • 组件【netty】
    • 组件【openapi-doc】
    • 组件【oss】
    • 组件【prometheus】
    • 组件【rate-limiter】
    • 组件【reactor】
    • 组件【redis】
    • 组件【secret】
    • 组件【security】
    • 组件【sensitive】
    • 组件【sms】
    • 组件【snail-job】
    • 组件【storage】
    • 组件【tdengine】
    • 组件【tenant】
    • 组件【test】
    • 组件【trace】
    • 组件【xss】
  • 环境搭建

    • Centos7安装Mysql 8.0.33
    • Centos7安装Redis 7.0.11
    • Centos7安装RocketMQ 5.1.1
    • Centos7安装Jdk 17.0.7
    • Centos7安装Docker 23.0.6
    • Centos7安装Elasticsearch 8.6.2
    • Docker安装RabbitMQ 3.12.2
    • Docker安装Postgresql 16.1
    • Ubuntu20.04安装Docker
    • Ubuntu20.04忘记密码或指纹错误
  • 常用命令

    • Centos7常用命令
    • Centos7常用命令
  • 快速上手

    • 项目启动【dev环境】
    • 项目启动【test环境】
    • 项目启动【prod环境】
    • 更新日志
  • 前端指南

    • 前端启动
  • 后端指南

    • COLA代码规范
    • SSL证书
    • 一键修改项目模块
    • 一键生成项目骨架
    • 一键修改项目版本号
    • 一键跳过测试用例
    • 一键生成后端COLA代码
    • 分布式链路跟踪之ELK日志
    • 一键检查代码规范
    • Spring Cloud Gateway+Redis+Nacos之动态路由和负载均衡
  • 项目部署

    • 项目部署之镜像打包与推送
  • 其他

    • Java如何快速转Go
    • Go快速开发API
    • Vue快速开发Api
    • React快速开发Api
  • 文章

    • 物联网之对接MQTT最佳实践
    • 物联网之使用Vertx实现MQTT-Server最佳实践【响应式】
    • vue3+lime-echart各种图表使用【懒人专用,建议收藏】
    • 物联网之使用Vertx实现TCP最佳实践【响应式】
    • 物联网之使用Vertx实现HTTPWebSocket最佳实践【响应式】
    • 物联网之使用Vertx实现UDP最佳实践【响应式】
    • Spring Cloud Gateway实现分布式限流和熔断降级
    • 物联网之常见网络配置
    • Go之封装Http请求和日志
    • 物联网之小白调试网关设备
    • 微服务之注册中心与ShardingSphere关于分库分表的那些事
    • Fory序列化与反序列化
  • 文章

    • IntelliJ IDEA插件推荐
  • 活动

    • KCloud-Platform-IoT 开源三周年快乐&父亲节快乐
  • 儒学

    • 儒学摘抄(一)
  • 禅语

    • 禅语摘抄(一)
  • 诗词

    • 诗词摘抄(一)
  • 道法

    • 道法摘抄(一)
  • 养生

    • 养生摘抄(一)
  • 读后感

    • 读《强者,都是含泪奔跑的人》读后感
  • 修行

    • 修身/养生/情感
  • 觉悟

    • 觉悟日记(一)
赞助
项目课程 (opens new window)
GitHub (opens new window)
首页
  • 开发手册

    • 组件【ai】
    • 组件【algorithm】
    • 组件【banner】
    • 组件【core】
    • 组件【bom】
    • 组件【cors】
    • 组件【domain】
    • 组件【crypto】
    • 组件【data-cache】
    • 组件【elasticsearch】
    • 组件【excel】
    • 组件【i18n】
    • 组件【idempotent】
    • 组件【influxdb】
    • 组件【kafka】
    • 组件【log】
    • 组件【lock】
    • 组件【mail】
    • 组件【log4j2】
    • 组件【mqtt】
    • 组件【mybatis-plus】
    • 组件【nacos】
    • 组件【netty】
    • 组件【openapi-doc】
    • 组件【oss】
    • 组件【prometheus】
    • 组件【rate-limiter】
    • 组件【reactor】
    • 组件【redis】
    • 组件【secret】
    • 组件【security】
    • 组件【sensitive】
    • 组件【sms】
    • 组件【snail-job】
    • 组件【storage】
    • 组件【tdengine】
    • 组件【tenant】
    • 组件【test】
    • 组件【trace】
    • 组件【xss】
  • 环境搭建

    • Centos7安装Mysql 8.0.33
    • Centos7安装Redis 7.0.11
    • Centos7安装RocketMQ 5.1.1
    • Centos7安装Jdk 17.0.7
    • Centos7安装Docker 23.0.6
    • Centos7安装Elasticsearch 8.6.2
    • Docker安装RabbitMQ 3.12.2
    • Docker安装Postgresql 16.1
    • Ubuntu20.04安装Docker
    • Ubuntu20.04忘记密码或指纹错误
  • 常用命令

    • Centos7常用命令
    • Centos7常用命令
  • 快速上手

    • 项目启动【dev环境】
    • 项目启动【test环境】
    • 项目启动【prod环境】
    • 更新日志
  • 前端指南

    • 前端启动
  • 后端指南

    • COLA代码规范
    • SSL证书
    • 一键修改项目模块
    • 一键生成项目骨架
    • 一键修改项目版本号
    • 一键跳过测试用例
    • 一键生成后端COLA代码
    • 分布式链路跟踪之ELK日志
    • 一键检查代码规范
    • Spring Cloud Gateway+Redis+Nacos之动态路由和负载均衡
  • 项目部署

    • 项目部署之镜像打包与推送
  • 其他

    • Java如何快速转Go
    • Go快速开发API
    • Vue快速开发Api
    • React快速开发Api
  • 文章

    • 物联网之对接MQTT最佳实践
    • 物联网之使用Vertx实现MQTT-Server最佳实践【响应式】
    • vue3+lime-echart各种图表使用【懒人专用,建议收藏】
    • 物联网之使用Vertx实现TCP最佳实践【响应式】
    • 物联网之使用Vertx实现HTTPWebSocket最佳实践【响应式】
    • 物联网之使用Vertx实现UDP最佳实践【响应式】
    • Spring Cloud Gateway实现分布式限流和熔断降级
    • 物联网之常见网络配置
    • Go之封装Http请求和日志
    • 物联网之小白调试网关设备
    • 微服务之注册中心与ShardingSphere关于分库分表的那些事
    • Fory序列化与反序列化
  • 文章

    • IntelliJ IDEA插件推荐
  • 活动

    • KCloud-Platform-IoT 开源三周年快乐&父亲节快乐
  • 儒学

    • 儒学摘抄(一)
  • 禅语

    • 禅语摘抄(一)
  • 诗词

    • 诗词摘抄(一)
  • 道法

    • 道法摘抄(一)
  • 养生

    • 养生摘抄(一)
  • 读后感

    • 读《强者,都是含泪奔跑的人》读后感
  • 修行

    • 修身/养生/情感
  • 觉悟

    • 觉悟日记(一)
赞助
项目课程 (opens new window)
GitHub (opens new window)
  • 开发手册

    • 组件【ai】
    • 组件【algorithm】
    • 组件【banner】
    • 组件【core】
    • 组件【bom】
    • 组件【cors】
    • 组件【domain】
    • 组件【crypto】
    • 组件【data-cache】
    • 组件【elasticsearch】
    • 组件【excel】
    • 组件【i18n】
    • 组件【idempotent】
    • 组件【influxdb】
    • 组件【kafka】
    • 组件【log】
    • 组件【lock】
    • 组件【mail】
    • 组件【log4j2】
    • 组件【mqtt】
    • 组件【mybatis-plus】
    • 组件【nacos】
    • 组件【netty】
    • 组件【openapi-doc】
    • 组件【oss】
    • 组件【prometheus】
    • 组件【rate-limiter】
    • 组件【reactor】
    • 组件【redis】
    • 组件【secret】
    • 组件【security】
    • 组件【sensitive】
    • 组件【sms】
    • 组件【snail-job】
    • 组件【storage】
    • 组件【tdengine】
    • 组件【tenant】
    • 组件【test】
    • 组件【trace】
    • 组件【xss】
  • 环境搭建

    • Centos7安装Mysql 8.0.33
    • Centos7安装Redis 7.0.11
    • Centos7安装RocketMQ 5.1.1
    • Centos7安装Jdk 17.0.7
    • Centos7安装Docker 23.0.6
    • Docker安装RabbitMQ 3.12.2
    • Centos7安装Elasticsearch 8.6.2
    • Docker安装Postgresql 16.1
    • Ubuntu20.04安装Docker
    • Ubuntu20.04忘记密码或指纹错误
  • 常用命令

    • Centos7常用命令
    • Docker常用命令
  • 快速上手

    • 项目启动【dev环境】
    • 项目启动【test环境】
    • 项目启动【prod环境】
    • 更新日志
  • 前端指南

    • 前端启动
  • 后端指南

    • COLA代码规范
    • SSL证书
    • 一键修改项目模块
    • 一键生成项目骨架
    • 一键修改项目版本号
    • 一键跳过测试用例
    • 一键生成后端COLA代码
    • 分布式链路跟踪之ELK日志
    • 一键检查代码规范
    • Spring Cloud Gateway+Redis+Nacos之动态路由和负载均衡
    • OAuth2.1流程
  • 项目部署

    • 项目部署之镜像打包与推送
  • 其他

    • Java如何快速转Go
    • Go快速开发API
    • Vue快速开发Api
    • React快速开发Api
  • 文章

    • 物联网之对接MQTT最佳实践
    • 物联网之使用Vertx实现MQTT-Server最佳实践【响应式】
    • vue3+lime-echart各种图表使用【懒人专用,建议收藏】
    • 物联网之使用Vertx实现TCP最佳实践【响应式】
    • 物联网之使用Vertx实现HTTPWebSocket最佳实践【响应式】
    • 物联网之使用Vertx实现UDP最佳实践【响应式】
    • Spring Cloud Gateway实现分布式限流和熔断降级
    • 物联网之常见网络配置
    • Go之封装Http请求和日志
    • 物联网之小白调试网关设备
    • 微服务之注册中心与ShardingSphere关于分库分表的那些事
    • Fory序列化与反序列化
      • 介绍
      • 实践
        • 依赖
        • 使用
        • Mybatis-Plus本地缓存SQL
        • Redis序列化
        • Kafka序列化
        • Pulsar序列化
  • 推荐

    • IntelliJ IDEA插件推荐
  • 活动

    • KCloud-Platform-IoT 开源三周年快乐&父亲节快乐
  • 指南
  • 文章
KCloud-Platform-IoT
2025-08-25
目录

Fory序列化与反序列化

你好呀,我的老朋友!我是老寇,欢迎来到老寇云平台!

跟我一起学习Fory序列化与反序列化

# 介绍

Fory官方地址 (opens new window)

Apache Fory是一个速度极快的多语言序列化框架,由JIT(即时编译)和零拷贝提供支持,可提供高达 170 倍的性能和极致的易用性

Apache Fory 之前名为 Apache Fury。对于 0.11 之前的版本,请在包名称、导入和依赖项中使用“fury”而不是“fory”

注意:这篇文章主要用来记录之前写的代码,便于后面翻阅查看!!!

# 实践

# 依赖

<dependency>
  <groupId>org.apache.fory</groupId>
  <artifactId>fory-core</artifactId>
  <version>0.12.0</version>
</dependency>

# 使用

public final class ForyFactory {

    public static final ForyFactory INSTANCE = new ForyFactory();

    private final ThreadSafeFory fory = new ForyBuilder().withLanguage(Language.JAVA)
       // enable reference tracking for shared/circular reference.
       // Disable it will have better performance if no duplicate reference.
       .withRefTracking(false)
       // compress int for smaller size
       // .withIntCompressed(true)
       // compress long for smaller size
       // .withLongCompressed(true)
       .withCompatibleMode(CompatibleMode.SCHEMA_CONSISTENT)
       // enable type forward/backward compatibility
       // disable it for small size and better performance.
       // .withCompatibleMode(CompatibleMode.COMPATIBLE)
       // enable async multi-threaded compilation.
       .withAsyncCompilation(true)
       .requireClassRegistration(true)
       .buildThreadSafeFory();

    public <T> void register(Class<T> clazz) {
       fory.register(clazz);
    }

    public byte[] serialize(Object object) {
       if (object == null) {
          return new byte[0];
       }
       if (object instanceof String str) {
          return str.getBytes(StandardCharsets.UTF_8);
       }
       return fory.serialize(object);
    }

    public Object deserialize(byte[] bytes) {
       if (bytes == null) {
          return null;
       }
       return fory.deserialize(bytes);
    }

}

# Mybatis-Plus本地缓存SQL

我们使用fory进行序列化,替换掉原有的jdk序列化

public class ForySerialCaffeineJsqlParseCache extends AbstractCaffeineJsqlParseCache {

    static {
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.Alias.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.Alias.AliasColumn.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.AllValue.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.AnalyticExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.AnyComparisonExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.ArrayConstructor.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.ArrayExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.CaseExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.CastExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.CollateExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.ConnectByRootOperator.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.DateTimeLiteralExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.DateValue.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.DoubleValue.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.ExtractExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.FilterOverImpl.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.Function.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.HexValue.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.IntervalExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.JdbcNamedParameter.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.JdbcParameter.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.JsonAggregateFunction.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.JsonExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.JsonFunction.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.JsonFunctionExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.JsonKeyValuePair.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.KeepExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.LongValue.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.MySQLGroupConcat.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.MySQLIndexHint.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.NextValExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.NotExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.NullValue.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.NumericBind.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.OracleHierarchicalExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.OracleHint.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.OracleNamedFunctionParameter.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.OrderByClause.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.OverlapsCondition.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.PartitionByClause.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.RangeExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.RowConstructor.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.RowGetExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.SQLServerHints.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.SignedExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.StringValue.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.TimeKeyExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.TimeValue.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.TimestampValue.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.TimezoneExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.TranscodingFunction.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.TrimFunction.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.UserVariable.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.VariableAssignment.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.WhenClause.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.WindowDefinition.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.WindowElement.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.WindowOffset.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.WindowRange.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.XMLSerializeExpr.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.arithmetic.Addition.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.arithmetic.BitwiseAnd.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.arithmetic.BitwiseLeftShift.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.arithmetic.BitwiseOr.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.arithmetic.BitwiseRightShift.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.arithmetic.BitwiseXor.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.arithmetic.Concat.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.arithmetic.Division.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.arithmetic.IntegerDivision.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.arithmetic.Modulo.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.arithmetic.Multiplication.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.arithmetic.Subtraction.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.conditional.AndExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.conditional.OrExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.conditional.XorExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.Between.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.ContainedBy.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.Contains.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.DoubleAnd.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.EqualsTo.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.ExistsExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.ExpressionList.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.FullTextSearch.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.GeometryDistance.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.GreaterThan.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.InExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.IsBooleanExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.IsDistinctExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.IsNullExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.JsonOperator.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.LikeExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.Matches.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.MemberOfExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.MinorThan.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.MinorThanEquals.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.NamedExpressionList.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.NotEqualsTo.class);
       ForyFactory.INSTANCE
          .register(net.sf.jsqlparser.expression.operators.relational.ParenthesedExpressionList.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.RegExpMatchOperator.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.SimilarToExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.TSQLLeftJoin.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.TSQLRightJoin.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.parser.ASTNodeAccessImpl.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.parser.Token.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.schema.Column.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.schema.Sequence.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.schema.Synonym.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.schema.Table.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.Block.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.Commit.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.DeclareStatement.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.DeclareStatement.TypeDefExpr.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.DescribeStatement.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.ExplainStatement.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.ExplainStatement.Option.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.IfElseStatement.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.OutputClause.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.PurgeStatement.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.ReferentialAction.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.ResetStatement.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.RollbackStatement.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.SavepointStatement.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.SetStatement.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.ShowColumnsStatement.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.ShowStatement.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.Statements.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.UnsupportedStatement.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.UseStatement.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.alter.Alter.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.alter.AlterExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.alter.AlterExpression.ColumnDataType.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.alter.AlterExpression.ColumnDropDefault.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.alter.AlterExpression.ColumnDropNotNull.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.alter.AlterSession.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.alter.AlterSystemStatement.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.alter.RenameTableStatement.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.alter.sequence.AlterSequence.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.analyze.Analyze.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.comment.Comment.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.create.function.CreateFunction.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.create.index.CreateIndex.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.create.procedure.CreateProcedure.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.create.schema.CreateSchema.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.create.sequence.CreateSequence.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.create.synonym.CreateSynonym.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.create.table.CheckConstraint.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.create.table.ColDataType.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.create.table.ColumnDefinition.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.create.table.CreateTable.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.create.table.ExcludeConstraint.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.create.table.ForeignKeyIndex.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.create.table.Index.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.create.table.Index.ColumnParams.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.create.table.NamedConstraint.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.create.table.RowMovement.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.create.view.AlterView.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.create.view.CreateView.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.delete.Delete.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.drop.Drop.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.execute.Execute.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.grant.Grant.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.insert.Insert.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.insert.InsertConflictAction.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.insert.InsertConflictTarget.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.merge.Merge.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.merge.MergeDelete.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.merge.MergeInsert.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.merge.MergeUpdate.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.AllColumns.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.AllTableColumns.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.Distinct.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.ExceptOp.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.Fetch.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.First.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.ForClause.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.GroupByElement.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.IntersectOp.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.Join.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.KSQLJoinWindow.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.KSQLWindow.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.LateralSubSelect.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.LateralView.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.Limit.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.MinusOp.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.Offset.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.OptimizeFor.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.OrderByElement.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.ParenthesedFromItem.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.ParenthesedSelect.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.Pivot.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.PivotXml.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.PlainSelect.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.SelectItem.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.SetOperationList.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.SetOperationList.SetOperationType.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.Skip.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.TableFunction.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.TableStatement.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.Top.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.UnPivot.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.UnionOp.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.Values.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.Wait.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.WithIsolation.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.WithItem.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.show.ShowIndexStatement.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.show.ShowTablesStatement.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.truncate.Truncate.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.update.Update.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.update.UpdateSet.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.upsert.Upsert.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.util.cnfexpression.MultiAndExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.util.cnfexpression.MultiOrExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.BinaryExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.ComparisonOperator.class);
       ForyFactory.INSTANCE
          .register(net.sf.jsqlparser.expression.operators.relational.OldOracleJoinBinaryExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.Function.NullHandling.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.CreateFunctionalStatement.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.Select.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.SetOperation.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.util.cnfexpression.MultipleExpression.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.insert.InsertModifierPriority.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.OrderByElement.NullOrdering.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.ForMode.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.MySqlSqlCacheFlags.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.PlainSelect.BigQuerySelectQualifier.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.update.UpdateModifierPriority.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.operators.relational.LikeExpression.KeyWord.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.delete.DeleteModifierPriority.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.schema.Partition.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.insert.ConflictActionType.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.ForClause.ForOption.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.KSQLWindow.TimeUnit.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.statement.select.First.Keyword.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.WindowElement.Type.class);
       ForyFactory.INSTANCE.register(net.sf.jsqlparser.expression.WindowOffset.Type.class);
    }

    public ForySerialCaffeineJsqlParseCache(Cache<String, byte[]> cache) {
       super(cache);
    }

    @Override
    public byte[] serialize(Object obj) {
       return ForyFactory.INSTANCE.serialize(obj);
    }

    @Override
    public Object deserialize(String sql, byte[] bytes) {
       return ForyFactory.INSTANCE.deserialize(bytes);
    }

}
static {
    JsqlParserGlobal.setJsqlParseCache(new ForySerialCaffeineJsqlParseCache(
          Caffeine.newBuilder().maximumSize(4096).expireAfterWrite(10, TimeUnit.MINUTES).build()));
}

# Redis序列化

jackson序列化

public final class GlobalJsonJacksonCodec extends JsonJacksonCodec {

    /**
     * 实例.
     */
    public static final GlobalJsonJacksonCodec INSTANCE = new GlobalJsonJacksonCodec();

    private GlobalJsonJacksonCodec() {
       super(objectMapper());
    }

    // @formatter:off
    /**
     * 解决查询缓存转换异常的问题.
     * @return ObjectMapper
     */
    private static ObjectMapper objectMapper() {
       ObjectMapper objectMapper = new ObjectMapper();
       DateTimeFormatter dateTimeFormatter = DateUtils.getDateTimeFormatter(DateUtils.YYYY_B_MM_B_DD_HH_R_MM_R_SS);
       JavaTimeModule javaTimeModule = new JavaTimeModule();
       // Long类型转String类型
       javaTimeModule.addSerializer(Long.class, ToStringSerializer.instance);
       javaTimeModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
       // LocalDateTime
       javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(dateTimeFormatter));
       javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(dateTimeFormatter));
       // Instant
       javaTimeModule.addSerializer(Instant.class, new CustomInstantSerializer(InstantSerializer.INSTANCE, false,false, dateTimeFormatter));
       javaTimeModule.addDeserializer(Instant.class, new CustomInstantDeserializer(InstantDeserializer.INSTANT, dateTimeFormatter));
       objectMapper.registerModule(javaTimeModule);
       // 所有属性访问器(字段、getter和setter),将自动检测所有字段属性
       objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
       // 对于所有非final类型,使用LaissezFaire子类型验证器来推断类型
       objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, NON_FINAL, JsonTypeInfo.As.PROPERTY);
       // 反序列化时,属性不存在的兼容处理
       objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
       // 自动查找并注册相关模块
       objectMapper.findAndRegisterModules();
       return objectMapper;
    }
    // @formatter:on

    public static Jackson2JsonRedisSerializer<Object> getJsonRedisSerializer() {
       // Json序列化配置
       return new Jackson2JsonRedisSerializer<>(objectMapper(), Object.class);
    }

}
/**
 * 自定义RedisTemplate.
 * @param lettuceConnectionFactory 工厂
 * @return RedisTemplate
 */
@Bean("redisTemplate")
@ConditionalOnMissingBean(RedisTemplate.class)
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(lettuceConnectionFactory);
    Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = getJsonRedisSerializer();
    // string序列化
    StringRedisSerializer stringRedisSerializer = getStringRedisSerializer();
    // key
    redisTemplate.setKeySerializer(stringRedisSerializer);
    // value
    redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
    // hash-key
    redisTemplate.setHashKeySerializer(stringRedisSerializer);
    // hash-value
    redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
    // 初始化
    redisTemplate.afterPropertiesSet();
    return redisTemplate;
}

@Bean("reactiveRedisTemplate")
@ConditionalOnMissingBean(ReactiveRedisTemplate.class)
public ReactiveRedisTemplate<String, Object> reactiveRedisTemplate(
       ReactiveRedisConnectionFactory reactiveRedisConnectionFactory) {
    Jackson2JsonRedisSerializer<Object> jsonRedisSerializer = getJsonRedisSerializer();
    StringRedisSerializer stringRedisSerializer = getStringRedisSerializer();
    RedisSerializationContext<String, Object> serializationContext = RedisSerializationContext
       .<String, Object>newSerializationContext()
       .key(stringRedisSerializer)
       .value(jsonRedisSerializer)
       .hashKey(stringRedisSerializer)
       .hashValue(jsonRedisSerializer)
       .build();
    return new ReactiveRedisTemplate<>(reactiveRedisConnectionFactory, serializationContext);
}

使用fory序列化,替换掉原来jackson

public final class ForyRedisSerializer implements RedisSerializer<Object> {

    @Override
    public byte[] serialize(Object obj) throws SerializationException {
       return ForyFactory.INSTANCE.serialize(obj);
    }

    @Override
    public Object deserialize(byte[] bytes) throws SerializationException {
       return ForyFactory.INSTANCE.deserialize(bytes);
    }

    public static StringRedisSerializer getStringRedisSerializer() {
       return new StringRedisSerializer(StandardCharsets.UTF_8);
    }

    public static ForyRedisSerializer foryRedisSerializer() {
       // Json序列化配置
       return new ForyRedisSerializer();
    }

}
@Bean("redisTemplate")
@ConditionalOnMissingBean(RedisTemplate.class)
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(lettuceConnectionFactory);
    // fory序列化
    ForyRedisSerializer foryRedisSerializer = foryRedisSerializer();
    // string序列化
    StringRedisSerializer stringRedisSerializer = getStringRedisSerializer();
    // key
    redisTemplate.setKeySerializer(stringRedisSerializer);
    // value
    redisTemplate.setValueSerializer(foryRedisSerializer);
    // hash-key
    redisTemplate.setHashKeySerializer(stringRedisSerializer);
    // hash-value
    redisTemplate.setHashValueSerializer(foryRedisSerializer);
    // 初始化
    redisTemplate.afterPropertiesSet();
    return redisTemplate;
}

@Bean("reactiveRedisTemplate")
@ConditionalOnMissingBean(ReactiveRedisTemplate.class)
public ReactiveRedisTemplate<String, Object> reactiveRedisTemplate(
       ReactiveRedisConnectionFactory reactiveRedisConnectionFactory) {
    // fory序列化
    ForyRedisSerializer foryRedisSerializer = foryRedisSerializer();
    // string序列化
    StringRedisSerializer stringRedisSerializer = getStringRedisSerializer();
    RedisSerializationContext<String, Object> serializationContext = RedisSerializationContext
       .<String, Object>newSerializationContext()
       .key(stringRedisSerializer)
       .value(foryRedisSerializer)
       .hashKey(stringRedisSerializer)
       .hashValue(foryRedisSerializer)
       .build();
    return new ReactiveRedisTemplate<>(reactiveRedisConnectionFactory, serializationContext);
}

# Kafka序列化

Kafka默认使用StringSerializer,因此,我们替换成fory

public class ForyKafkaDeserializer implements Deserializer<Object> {

    @Override
    public Object deserialize(String s, byte[] bytes) {
       return ForyFactory.INSTANCE.deserialize(bytes);
    }

}
public class ForyKafkaSerializer implements Serializer<Object> {

    @Override
    public byte[] serialize(String s, Object o) {
       return ForyFactory.INSTANCE.serialize(o);
    }

}
spring:
  kafka:
    consumer:
      # 键的序列化方式
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      # 值的序列化方式
      value-deserializer: xxx.ForyKafkaDeserializer
    producer:
      # 键的序列化方式
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      # 值的序列化方式
      value-serializer: xxx.ForyKafkaSerializer

# Pulsar序列化

public final class ForySchema extends AbstractSchema<Object> {

    public static final ForySchema INSTANCE = new ForySchema();

    @Override
    public byte[] encode(Object message) {
       return ForyFactory.INSTANCE.serialize(message);
    }

    @Override
    public Object decode(byte[] bytes) {
       return ForyFactory.INSTANCE.deserialize(bytes);
    }

    @Override
    public SchemaInfo getSchemaInfo() {
       return SchemaInfo.builder().name("Fory").type(SchemaType.BYTES).schema(new byte[0]).build();
    }

    @Override
    public Object decode(ByteBuf byteBuf) {
       return ForyFactory.INSTANCE.deserialize(byteBuf.array());
    }

}
@Component
@RequiredArgsConstructor
public class PulsarMessageHandler {

    private final ReactivePulsarTemplate<Object> reactivePulsarTemplate;

    public Mono<MessageId> handle() {
       return reactivePulsarTemplate.send("xxx", null, ForySchema.INSTANCE);
    }

}

我是老寇,我们下次再见啦!

上次更新: 8/27/2025, 11:11:12 AM
微服务之注册中心与ShardingSphere关于分库分表的那些事
IntelliJ IDEA插件推荐

← 微服务之注册中心与ShardingSphere关于分库分表的那些事 IntelliJ IDEA插件推荐→

Theme by Vdoing | Copyright © 2022-2025 laokou | Apache 2.0 License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式