附录 E. 其他二进制格式与 CBOR 设计目标的比较
CBOR 的提出, 承接了一条与计算机本身历史一样悠久的二进制格式历史. 不同的格式有不同的目标. 在大多数情况下, 格式的目标从未被说明, 尽管有时可以从该格式最初被使用的上下文中推断出来. 有些格式意在通用, 但历史已经证明, 没有任何一种二进制格式能满足所有协议和应用的需求.
CBOR 与其中许多格式的不同之处在于, 它从一组目标出发, 并试图恰好满足这些目标. 本节把数十种格式中的几种与 CBOR 的目标作比较, 以帮助读者判断在某个特定协议或应用中是想使用 CBOR 还是另一种格式.
请注意, 这里的讨论无意批评任何格式: 据我们所知, 在 CBOR 之前没有任何格式意在以我们所赋予的优先级来覆盖 CBOR 的这些目标. 第 1.1 节目的简要重述如下:
-
对互联网标准中大多数常见数据格式进行无歧义编码
-
编码器或解码器的代码紧凑性
-
无需模式描述
-
相当紧凑的序列化
-
适用于受限和非受限应用
-
良好的 JSON 转换能力
-
可扩展性
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 713 | c2 05 81 c2 02 82 83 | |
| ASN.1 BER | 30 0b 02 01 01 30 06 02 01 02 02 01 03 | 30 80 02 01 01 30 06 02 01 02 02 01 03 00 00 |
| MessagePack | 92 01 92 02 03 | |
| BSON | 22 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 | |
| UBJSON | 61 02 42 01 61 02 42 02 42 03 | 61 ff 42 01 61 02 42 02 42 03 45 |
| CBOR | 82 01 82 02 03 | 9f 01 82 02 03 ff |
表 6: 不同紧凑程度的示例