FlatBuffers与Protobuf应用场景再审视:是否有新变化?
数据交换格式对比:Protobuf vs FlatBuffers 及后续变化
问题
自Kenton Varda于2014年撰写的相关文章发布以来,FlatBuffers与Protobuf的适用场景是否发生了变化?或者是否出现了如今更受青睐的数据交换格式/库?
主流数据交换格式特性对比
| 特性 | Protobuf | Cap'n Proto | SBE | FlatBuffers |
|---|---|---|---|---|
| Schema 演进 | 支持 | 支持 | 有限支持 | 支持 |
| 零拷贝 | 不支持 | 支持 | 支持 | 支持 |
| 随机访问读取 | 不支持 | 支持 | 不支持 | 支持 |
| 恶意输入防护 | 支持 | 支持 | 支持 | 需提前主动开启 |
| 反射/通用算法 | 支持 | 支持 | 支持 | 支持 |
| 初始化顺序 | 任意顺序 | 任意顺序 | 前序 | 自底向上 |
| 未知字段保留 | Proto3 中已移除 | 支持 | 不支持 | 不支持 |
| 对象能力RPC系统 | 不支持 | 支持 | 不支持 | 不支持 |
| Schema 语言 | 自定义语法 | 自定义语法 | XML | 自定义语法 |
| 可作为可变状态使用 | 支持 | 不支持 | 不支持 | 不支持 |
| 填充数据占用传输空间? | 不占用 | 可选 | 占用 | 占用 |
| 未设置字段占用传输空间? | 不占用 | 占用 | 占用 | 不占用 |
| 指针占用传输空间? | 不占用 | 占用 | 不占用 | 占用 |
| C++ | 支持 | 支持(需C++11)* | 支持 | 支持 |
| Java | 支持 | 支持* | 支持 | 支持 |
| C# | 支持 | 支持* | 支持 | 支持* |
| Go | 支持 | 支持 | 不支持 | 支持* |
| 其他语言支持 | 大量支持 | 6种以上其他语言* | 不支持 | 不支持 |
| 作者推荐适用场景 | 分布式计算 | 平台/沙箱化 | 金融交易 | 游戏 |
现状总结
从实际情况来看,自2014年那篇文章发布后,相关格局几乎没有变化,核心总结如下:
- Protobuf
- 更适合1MB及以下的小消息场景
- 对开发者更友好,上手成本低
- FlatBuffers
- 适用于大消息传输场景
- 针对高效解析做了专门优化
- 内存使用表现更优
内容的提问来源于stack exchange,提问作者GentlemanS
相关产品推荐
相关产品推荐

