应避开JDK原生序列化,选用Kryo、FST、Protobuf等高性能方案,并精简传输对象、结合RPC框架集成,同时注意版本兼容、空值处理、预注册类和耗时监控。

在 Java 的 RPC 调用中实现对象的快速序列化,核心是**避开 JDK 原生序列化(java.io.Serializable)**,改用高性能、紧凑、跨语言友好的序列化方案,并配合合理的对象设计与传输优化策略。
选用高性能序列化框架
JDK 自带序列化性能差、体积大、不支持跨语言,应替换为以下成熟方案:
- Kryo:纯 Java,启动快、序列化后体积小、速度极快;需提前注册类(可配置自动注册),适合内部服务间调用;注意线程安全(Kryo 实例非线程安全,建议 ThreadLocal 或池化)。
- FST(Fast-Serialization):兼容 JDK 序列化接口,无需修改类定义,性能接近 Kryo,适合迁移成本敏感场景。
- Protobuf(Protocol Buffers):需定义 .proto 文件并生成 Java 类,强契约、跨语言、体积最小、性能优异;适合长期演进、多语言协作的微服务架构;gRPC 默认序列化方式。
- FlatBuffers / Cap'n Proto:零拷贝解析,适合高吞吐低延迟场景(如游戏、实时风控),但 Java 生态和易用性略弱于 Protobuf。
精简传输对象结构
再快的序列化器也救不了臃肿的对象。RPC 中只传必要字段:
- 避免传递完整 Entity/DTO,定义专用的 RPC Request/Response VO 类,仅含接口契约所需字段。
- 移除无意义的 getter/setter、冗余注解(如 @JsonIgnore、@Transient 不影响序列化器,但可能干扰反射逻辑)。
- 慎用嵌套过深的对象或动态集合(如 Map<String, Object>),它们会显著增加序列化开销和兼容风险;优先用确定结构的 POJO。
- 对字节数组、JSON 字符串等二进制数据,直接用 byte[] 传输,不要包装成 Base64 String(避免额外编解码)。
结合 RPC 框架做序列化集成
主流 RPC 框架均支持自定义序列化器:
立即学习“Java免费学习笔记(深入)”;
-
Dubbo:通过
serialization配置项指定(如kryo、protobuf-json),需引入对应依赖(dubbo-serialization-kryo)并配置 Kryo 的 Serializer。 -
gRPC-Java:原生基于 Protobuf,只需定义 .proto 并使用生成的 Stub;若需其他格式,需自定义
Marshaller(较复杂,一般不推荐)。 -
Spring Cloud OpenFeign:默认走 HTTP + JSON(Jackson),可通过自定义
Encoder/Decoder替换为 Protobuf 或 Avro,但需服务端配合。 - 自研或轻量 RPC(如基于 Netty):直接在编解码器(
ChannelHandler)中集成 Kryo 或 Protobuf 的ByteBuf编解码逻辑。
补充关键实践建议
光选对工具还不够,还需注意这些细节:
- 版本兼容性:Protobuf 用 field number + required/optional 规则管理兼容性;Kryo/FST 建议开启类名注册+版本号字段,避免升级后反序列化失败。
- 空值与默认值处理:Protobuf 默认忽略 null 字段;Kryo 可配置是否序列化 null;统一约定空集合传 emptyList() 而非 null,减少歧义。
-
避免运行时反射开销:Kryo 默认用反射,开启
setRegistrationRequired(true)并预注册类,关闭动态类生成,提升稳定性和性能。 - 监控序列化耗时:在 RPC Filter 或 Interceptor 中统计 serialize/deserialize 耗时,识别慢序列化瓶颈(如某类含大量未优化集合)。


















