Protobuf是Java分布式场景下综合最均衡的高效序列化协议,体积小、速度快、跨语言稳;Avro适合Schema频繁演进的大数据链路;Thrift适用于强契约多语言混合系统;Hessian仅限老Java系统过渡。

选高效序列化协议,核心看三个硬指标:体积小、速度快、跨语言稳。Protobuf 是当前 Java 分布式场景下综合表现最均衡的选择,尤其适合 RPC 和消息传输;Avro 适合大数据流水线;Thrift 在强契约+多语言混合系统里仍有优势;Hessian 仅限老 Java 系统平滑过渡,不建议新项目采用。
Protobuf:高并发 RPC 的首选
它在序列化体积、解析速度、跨语言支持上都经过大规模验证。Java 生态中与 Dubbo、gRPC 深度集成,生成代码类型安全、无反射开销。关键要配对用好:
• proto 文件中 repeated 数值字段必须加 packed=true,否则体积和解析成本翻倍
• 编译时指定 optimize_for = SPEED,避免默认的 CODE_SIZE 模式拖慢吞吐
• 反序列化前先调用 get_packed_size() 预估缓冲区,减少内存重分配
• 高频路径用 ProtobufCBufferSimple 实现零拷贝写入
Avro:适合 Schema 演进频繁的大数据链路
Schema 与数据分离,天然支持字段增删、默认值、兼容性检查(如 BACKWARD/FOREWARD),特别适合 Kafka + Flink 流式处理场景。但 Java 侧需额外管理 .avsc 文件和生成类,不如 Protobuf 编译链成熟。注意:
• 不依赖运行时反射推断类型,反序列化更稳定
• 二进制格式紧凑,体积略大于 Protobuf,但解析速度稍慢
• 对 Java 泛型、嵌套泛型支持比 Protobuf 更自然
Thrift:契约优先、多语言强一致的系统
IDL 定义严格,生成代码一致性高,Facebook 和 Meta 内部长期使用。适合 Java + Python + Go 混合服务且对字段语义一致性要求极高的场景。但生态工具链不如 Protobuf 活跃,社区更新节奏偏慢。提醒:
• 必须用 .thrift 文件定义结构,无法像 Protostuff 那样直接序列化任意 POJO
• 支持可选字段和命名空间,版本演进策略清晰
• Java 序列化器默认不压缩,需手动开启 CompactProtocol 提升效率
Hessian:只用于遗留 Java 系统升级过渡
它不是跨语言友好协议,PHP/Python 实现残缺,枚举、LocalDateTime、泛型 Map 等常见类型支持差。线上问题多集中在类加载和类型映射上:
• 必须升级到 Hessian 4.0.12+ 并关闭 hessian.allowNonSerializable=false
• Java 8 时间类型需显式注册序列化器,否则反序列化失败
• Map


















