那么BSON是JSON序列化的吗?
{"hello": "world"} → "\x16\x00\x00\x00\x02hello\x00 \x06\x00\x00\x00world\x00\x00"
但是为什么叫Binary Json呢?二进制代表什么?
我总是倾向于将二进制与 10101010101 联系起来。但是上面的 BSON 序列化格式不是 101010101010 的形式。
有人可以为我解释一下这里的二进制是什么意思,这样我就明白为什么它被称为二进制 JSON 了吗?
那么BSON是JSON序列化的吗?
{"hello": "world"} → "\x16\x00\x00\x00\x02hello\x00 \x06\x00\x00\x00world\x00\x00"
但是为什么叫Binary Json呢?二进制代表什么?
我总是倾向于将二进制与 10101010101 联系起来。但是上面的 BSON 序列化格式不是 101010101010 的形式。
有人可以为我解释一下这里的二进制是什么意思,这样我就明白为什么它被称为二进制 JSON 了吗?
它是二进制而不是文本。JSON 是人类可读的文本,而 BSON 是二进制数据(只是字节)。您可以将其写为 1001010 等,但更常见的是一次显示每个字节(因此 \x16 只是十六进制 16,即十进制字节 22)。基本上这里的“二进制”用于将其与文本数据进行比较,并不是说它实际上是特别是基数 2。
这意味着您只能在可以传输任意二进制数据的情况下使用 BSON。例如,如果您想将 BSON 嵌入 XML 文档(无论出于何种原因!),您必须首先对其进行 base64 编码,因为 XML 是基于文本的表示。
二进制确实是用词不当,因为您计算机上的所有内容在某种程度上都是“二进制”的。二进制,当涉及到文件或网络流格式时,意味着不容易被人类理解。它也趋于紧凑。
文本或“人类可读”(人类可理解)文件和流格式的示例:
“二进制”文件和流格式的示例:
这里最值得注意的是,如果您只是将它们打开并开始阅读,那么人类可以理解的格式需要的解释要少得多。二进制文件格式可能需要整本书来解释:)
不过,格式不一定是纯粹的“二进制”或纯粹是人类可以理解的。例如,您可能会理解一系列不带空格的个位数字,它们表示一个个位数字的数组。您可能无法理解一系列 48 个数字(没有空格),它们表示 16 个 3d 顶点的 x、y 和 z 值,即使您可以“阅读”它们。此外,还有 Skeet 的编码“二进制”数据示例,特别是如果它嵌入在更易于人类理解的格式中。
已经解释了它被称为“二进制”的原因:基本上,它不是文本的,因此是 unix 风格的区别(二进制文件与文本文件)。
但是 JSON 部分也很奇怪,因为 BSON 不是 JSON——它既不是子集也不是超集。它有更多的数据类型,所以它是一种超集;但由于属性名称和字符串值长度限制等限制,它也不支持所有合法的 JSON。