对比
CBOR 与 MessagePack
CBOR 和 MessagePack 都能将类似 JSON 的值序列化为二进制。CBOR 标准化协议标签和确定性编码规则;MessagePack 提供通用对象的紧凑编码。
应该选择哪种格式?
协议需要 IETF 标准标签或确定性编码时可考虑 CBOR;若优先兼容现有应用和库,可选择 MessagePack。请测试数值范围、扩展、规范化以及不同实现间的行为。
适用于 CBOR
在受限设备和网络中交换结构化数据 · 在 COSE 和物联网协议中表示数据
- 以紧凑二进制形式表示类似 JSON 的数据
- 使用标准标签或应用自定义标签说明值的含义
适用于 MessagePack
将类似 JSON 的数据序列化为二进制 · 在兼容的应用程序之间交换结构化数据
- 以二进制编码类似 JSON 的数组、映射和基本值
- 在兼容的程序库之间交换扩展类型和时间戳
基本信息
| 项目 | CBOR | MessagePack |
|---|---|---|
| 扩展名 | .cbor | .msgpack, .mpk |
| MIME 类型 | application/cbor | application/octet-stream |
| 常见用途 | 在受限设备和网络中交换结构化数据 · 在 COSE 和物联网协议中表示数据 | 将类似 JSON 的数据序列化为二进制 · 在兼容的应用程序之间交换结构化数据 |
| 打开方式 | 使用 CBOR 程序库或解码器读取,再通过诊断表示或类似 JSON 的视图检查内容。对于标签和字节串等无法直接映射到 JSON 的值,应确认其显示方式。 | 使用支持 MessagePack 的程序库或解码器读取。要检查内容,可查看诊断表示或类似 JSON 的视图,并确认二进制值和扩展值的显示方式。 |
| 导出或转换 | 转换为 JSON 时,字节串和带标签的值可能需要工具专用的表示方式,因为 JSON 没有直接对应类型。用于签名、哈希或缓存键时,应遵循协议约定的编码规则,例如 RFC 8949 中的确定性编码。 | 转换为 JSON 时,二进制值和扩展值可能需要表示成数组、字符串或工具专用封装,因为标准 JSON 没有直接对应类型。若需往返转换,请用实际数据检查类型、数值范围、时间戳、映射键和扩展类型。 |
按用途选择
以紧凑二进制形式表示类似 JSON 的数据
在受限设备和网络中交换结构化数据 · 在 COSE 和物联网协议中表示数据
CBOR使用标准标签或应用自定义标签说明值的含义
在受限设备和网络中交换结构化数据 · 在 COSE 和物联网协议中表示数据
CBOR以二进制编码类似 JSON 的数组、映射和基本值
将类似 JSON 的数据序列化为二进制 · 在兼容的应用程序之间交换结构化数据
MessagePack在兼容的程序库之间交换扩展类型和时间戳
将类似 JSON 的数据序列化为二进制 · 在兼容的应用程序之间交换结构化数据
MessagePack关键点 1
CBOR 在 RFC 8949 中定义整数、字节串、数组、映射和标签。MessagePack 定义整数、字符串、二进制值、数组、映射及应用自定义扩展类型。
进一步了解差异关键点 2
CBOR 规定了确定性编码要求,可用于签名或哈希等需要一致表示的协议。MessagePack 应用可能需要自行约定键顺序和扩展类型规则。
进一步了解差异进一步了解差异
根据协议和生态选择,不要假设某一种总是更小或更快。明确标签、扩展、映射键、数字和可选值的对应规则,并用实际数据测试。
- CBOR 标签可标识应用层值语义,RFC 8949 也说明确定性编码要求。MessagePack 扩展类型承载应用自定义的类型标识与字节。
- 两者即使表示相似数据也不共享字节编码,不能假设一种格式的解码器能读取另一种。
- 转换可能改变数字宽度、映射键类型、标签或扩展值。请定义映射并在实际实现间测试往返结果。
常见问题
CBOR 与 MessagePack 是否二进制兼容?
不是。它们的编码和扩展模型不同,需要显式转换或共享的协议定义。