对比
BSON 与 MessagePack
BSON 和 MessagePack 都可表示类似文档的二进制数据,但 BSON 是与 MongoDB 相关的类型化文档表示,MessagePack 是通用对象序列化格式。
应该选择哪种格式?
MongoDB 文档以及 ObjectId、日期等 BSON 专有值请用 BSON。MongoDB 之外交换紧凑对象时可考虑 MessagePack,并事先约定扩展类型和接收端支持。
适用于 BSON
序列化 MongoDB 文档 · 在支持 BSON 的工具之间交换文档
- 保留日期和二进制数据等类型
- 使用能够读写 BSON 的驱动程序和工具
适用于 MessagePack
将类似 JSON 的数据序列化为二进制 · 在兼容的应用程序之间交换结构化数据
- 以二进制编码类似 JSON 的数组、映射和基本值
- 在兼容的程序库之间交换扩展类型和时间戳
基本信息
| 项目 | BSON | MessagePack |
|---|---|---|
| 扩展名 | .bson | .msgpack, .mpk |
| MIME 类型 | application/bson | application/octet-stream |
| 常见用途 | 序列化 MongoDB 文档 · 在支持 BSON 的工具之间交换文档 | 将类似 JSON 的数据序列化为二进制 · 在兼容的应用程序之间交换结构化数据 |
| 打开方式 | 可用 mongorestore 或支持 BSON 的工具、程序库读取。要查看内容,可先转换为 Extended JSON 等可读表示。不要用文本编辑器修改二进制文件。 | 使用支持 MessagePack 的程序库或解码器读取。要检查内容,可查看诊断表示或类似 JSON 的视图,并确认二进制值和扩展值的显示方式。 |
| 导出或转换 | 转换为 JSON 时,日期、ObjectId 和二进制值可能需要使用 Extended JSON 写法或应用专用表示,因为标准 JSON 没有对应类型。如果需要往返转换,应选择能保留类型信息的方法,并用实际数据测试。 | 转换为 JSON 时,二进制值和扩展值可能需要表示成数组、字符串或工具专用封装,因为标准 JSON 没有直接对应类型。若需往返转换,请用实际数据检查类型、数值范围、时间戳、映射键和扩展类型。 |
按用途选择
保留日期和二进制数据等类型
序列化 MongoDB 文档 · 在支持 BSON 的工具之间交换文档
BSON使用能够读写 BSON 的驱动程序和工具
序列化 MongoDB 文档 · 在支持 BSON 的工具之间交换文档
BSON以二进制编码类似 JSON 的数组、映射和基本值
将类似 JSON 的数据序列化为二进制 · 在兼容的应用程序之间交换结构化数据
MessagePack在兼容的程序库之间交换扩展类型和时间戳
将类似 JSON 的数据序列化为二进制 · 在兼容的应用程序之间交换结构化数据
MessagePack关键点 1
BSON 定义带长度前缀的文档和数组,并提供日期、ObjectId、Decimal128 等显式类型。MessagePack 提供通用映射、数组、数字、字符串、二进制值和应用自定义扩展。
进一步了解差异关键点 2
BSON 适合 MongoDB 文档模型及相关工具;MessagePack 用于不依赖特定数据库的通用序列化。
进一步了解差异进一步了解差异
需要 MongoDB 兼容文档类型时选 BSON;需要独立于数据库的二进制对象协议时选 MessagePack。转换前映射日期、整数宽度、十进制数、ObjectId 和扩展值,并测试往返。
- 两者都采用二进制编码,但结构和类型系统不同,不能直接互相读取。
- BSON 有文档相关的专用类型与约定。MessagePack 扩展类型的含义需由应用定义。
- 转换可能更改日期、数值范围、十进制数或标识符语义。请记录映射并用接收端实现验证值。
常见问题
把 BSON 文件改名为 MessagePack 就可以转换吗?
不可以。改扩展名不会转换二进制结构和类型;必须使用解码器及明确字段映射重新序列化。