Format Atlas

对比

CBOR 与 MessagePack

CBOR 和 MessagePack 都能将类似 JSON 的值序列化为二进制。CBOR 标准化协议标签和确定性编码规则;MessagePack 提供通用对象的紧凑编码。

应该选择哪种格式?

协议需要 IETF 标准标签或确定性编码时可考虑 CBOR;若优先兼容现有应用和库,可选择 MessagePack。请测试数值范围、扩展、规范化以及不同实现间的行为。

适用于 CBOR

在受限设备和网络中交换结构化数据 · 在 COSE 和物联网协议中表示数据

  • 以紧凑二进制形式表示类似 JSON 的数据
  • 使用标准标签或应用自定义标签说明值的含义

适用于 MessagePack

将类似 JSON 的数据序列化为二进制 · 在兼容的应用程序之间交换结构化数据

  • 以二进制编码类似 JSON 的数组、映射和基本值
  • 在兼容的程序库之间交换扩展类型和时间戳

基本信息

项目CBORMessagePack
扩展名.cbor.msgpack, .mpk
MIME 类型application/cborapplication/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 是否二进制兼容?

不是。它们的编码和扩展模型不同,需要显式转换或共享的协议定义。

了解详情

参考资料与规范