跳到主要内容

附录 E. 其他二进制格式与 CBOR 设计目标的比较

CBOR 的提出, 承接了一条与计算机本身历史一样悠久的二进制格式历史. 不同的格式有不同的目标. 在大多数情况下, 格式的目标从未被说明, 尽管有时可以从该格式最初被使用的上下文中推断出来. 有些格式意在通用, 但历史已经证明, 没有任何一种二进制格式能满足所有协议和应用的需求.

CBOR 与其中许多格式的不同之处在于, 它从一组目标出发, 并试图恰好满足这些目标. 本节把数十种格式中的几种与 CBOR 的目标作比较, 以帮助读者判断在某个特定协议或应用中是想使用 CBOR 还是另一种格式.

请注意, 这里的讨论无意批评任何格式: 据我们所知, 在 CBOR 之前没有任何格式意在以我们所赋予的优先级来覆盖 CBOR 的这些目标. 第 1.1 节目的简要重述如下:

  1. 对互联网标准中大多数常见数据格式进行无歧义编码

  2. 编码器或解码器的代码紧凑性

  3. 无需模式描述

  4. 相当紧凑的序列化

  5. 适用于受限和非受限应用

  6. 良好的 JSON 转换能力

  7. 可扩展性

E.1. ASN.1 DER、BER 和 PER​

  • [ASN.1] 有许多种序列化方式. 在 IETF 中, DER 和 BER 是最常见的. 对许多数据项而言, 序列化输出并不特别紧凑, 而且在受限设备上解码数值项所需的代码可能很复杂.

很少有 (如果有的话) IETF 协议采用了几种压缩编码规则 (Packed Encoding Rules, PER) 变体中的某一种. 这可能有多种原因, 但常被提及的一个原因是: PER 甚至在解析数据流的表面结构时也要用到模式, 需要大量工具支持. 现有使用的 ASN.1 模式语言还有不同版本, 这也阻碍了它的采用.

E.2. MessagePack​

  • [MessagePack] 是一种简洁的、被广泛实现的计数式二进制序列化格式, 在许多特性上与 CBOR 相似, 尽管规则性稍差. 虽然其数据模型可用于表示 JSON 数据, MessagePack 也被用在许多远程过程调用 (RPC) 应用以及数据的长期存储中.

MessagePack 自 2011 年前后首次发布以来基本保持稳定; 它尚未经历过一次转型. MessagePack 的演进受到一种要求的阻碍, 即必须与现有已存储数据保持完全的向后兼容, 而同时可供扩展的字节码只剩下很少几个. 多年来 MessagePack 用户社区不断提出在编码中把二进制串和文本串分离开的请求, 最近促成了一项扩展提案, 该提案会使 MessagePack 的 "raw" 数据在用于二进制数据和文本数据之间产生歧义. MessagePack 的扩展机制仍不明确.

E.3. BSON​

  • [BSON] 是为在 MongoDB 数据库中存储类 JSON 映射 (JSON 对象) 而开发的数据格式. 它的主要特色是支持原地更新, 为此放弃了紧凑的表示. BSON 使用计数式表示, 但映射的键除外, 它们以空字节终止. 虽然 BSON 可以用于在线路上表示类 JSON 对象, 但其规范被数据库应用的需求所主导, 已经变得有些繁复. BSON 扩展将如何实现, 其状况仍不明确.

E.4. UBJSON​

  • [UBJSON] 的设计目标是让 JSON 更快、并稍微更小, 它使用的二进制格式被严格限定在 JSON 所使用的数据模型之内. 因此, 它明确无意支持例如二进制数据; 不过它有一种 "高精度数字", 以 JSON 语法中的字符串表示. UBJSON 并未针对代码紧凑性做优化, 其类型字节编码针对的是人类可识别性, 而非小整数等原生类型的紧凑表示. 尽管 UBJSON 大多是计数式的, 它提供了一个保留的 "unknown-length" 值以支持数组和映射 (JSON 对象) 的流式处理. 在这些容器内部, UBJSON 还提供了一个用于填充的 "Noop" 类型.

E.5. MSDTP: RFC 713​

消息服务数据传输 (Message Services Data Transmission, MSDTP) 是一种非常早期的紧凑消息格式示例; 它在 1976 年编写的 [RFC0713] 中被描述. 之所以在此列出, 是出于其历史价值, 而不是因为它曾经被广泛使用.

E.6. 线路上的紧凑性​

虽然 CBOR 关于编码器和解码器代码紧凑性的设计目标, 其优先级高于它在线路上紧凑性的目标, 但许多人关注的是线路尺寸. 表 6 给出了简单嵌套数组 [1, [2, 3]] 的一些编码示例; 对于该编码支持某种不定长编码的情形, 也一并给出了 [_ 1, [2, 3]] (外层数组为不定长).

格式[1, [2, 3]][_ 1, [2, 3]]
RFC 713c2 05 81 c2 02 82 83
ASN.1 BER30 0b 02 01 01 30 06 02 01 02 02 01 0330 80 02 01 01 30 06 02 01 02 02 01 03 00 00
MessagePack92 01 92 02 03
BSON22 00 00 00 10 30 00 01 00 00 00 04 31 00 13 00 00 00 10 30 00 02 00 00 00 10 31 00 03 00 00 00 00 00
UBJSON61 02 42 01 61 02 42 02 42 0361 ff 42 01 61 02 42 02 42 03 45
CBOR82 01 82 02 039f 01 82 02 03 ff

表 6: 不同紧凑程度的示例