Bson类似于Protocol Buffer的数据形式,比json更轻量级更高效
一、Bson介紹
BSON是Binary JSON的縮寫(xiě),是一種類(lèi)json的一種二進(jìn)制形式的存儲(chǔ)格式。
它和JSON一樣,支持內(nèi)嵌的文檔對(duì)象和數(shù)組對(duì)象,但是BSON在JSON基礎(chǔ)上進(jìn)行了一些數(shù)據(jù)類(lèi)型的擴(kuò)展,如Date和BinData類(lèi)型。
BSON是二進(jìn)制形式的存儲(chǔ)格式,類(lèi)似于Google的Protocol Buffer。
但是BSON是“schema-less”的存儲(chǔ)形式,這使得它在靈活性方面具有優(yōu)勢(shì),但在空間效率方面也有一點(diǎn)劣勢(shì)(對(duì)于序列化數(shù)據(jù)中包含的字段名,BSON有開(kāi)銷(xiāo))。
二、特點(diǎn):
BSON有三個(gè)特點(diǎn):輕量級(jí)、可遍歷性、高效性。
輕量級(jí)
對(duì)于任何一種數(shù)據(jù)表示格式(尤其是在網(wǎng)絡(luò)上使用時(shí))來(lái)說(shuō),將存儲(chǔ)空間保持在最小值是非常重要的。
可遍歷性
BSON被設(shè)計(jì)成易于操作。這是作為MongoDB的主要數(shù)據(jù)代表的重要支持。
高效性
由于使用了C數(shù)據(jù)類(lèi)型,在大多數(shù)語(yǔ)言中,對(duì)BSON進(jìn)行編碼和對(duì)BSON進(jìn)行解碼都可以非常快速地完成。
三、Bson的數(shù)據(jù)類(lèi)型
BSON支持的類(lèi)型:
有一個(gè)枚舉BsonType(Bson 3.0新增的枚舉),里面就是Bson的所支持的數(shù)據(jù)類(lèi)型。
還有一個(gè)類(lèi)BSON,也包含了各種類(lèi)型。
| Double | 1 | "double" | |
| String | 2 | "string" | |
| Object | 3 | "object" | Document類(lèi)型 |
| Array | 4 | "array" | |
| Binary data | 5 | "binData" | |
| Undefined | 6 | "undefined" | Deprecated |
| ObjectId | 7 | "objectId" | |
| Boolean | 8 | "bool" | |
| Date | 9 | "date" | DATE_TIME類(lèi)型 |
| Null | 10 | "null" | |
| Regular Expression | 11 | "regex" | |
| DBPoint | 12 | "dbPointer" | Deprecated |
| JavaScript | 13 | "javaScript" | |
| Symbol | 14 | "symbol" | Deprecated |
| JavaScript(with scope) | 15 | "javaScriptWithScope" | |
| 32-bit integer | 16 | "int" | |
| Timestamp | 17 | "timestamp" | |
| 64-bit integer | 18 | "long" | |
| Decimal128 | 19 | "decimal" | New version in 3.4. |
| Min Key | -1 | "minKey" | |
| Max Key | 127 | "maxKey" |
四、Bson的格式
主要解釋bsonspec.org網(wǎng)站上的兩個(gè)例子
一、對(duì)象
{"hello": "world"}hello為key,world為value 對(duì)應(yīng)的是
\x16\x00\x00\x00 \x02hello\x00\x06\x00\x00\x00world\x00\x00解釋每一行的意思:
\x16\x00\x00\x00:\x表示16進(jìn)制的方式。4個(gè)字節(jié)表示文檔的大小,包括文檔末尾的'\0','\0'是\x00 0x16十進(jìn)制是22,這個(gè)文檔的大小是22個(gè)字節(jié)
采用小端(Little Endian) 原文:Each type must be serialized in little-endian format.
每一種類(lèi)型必須按照l(shuí)ittle-endian格式序列化。
\x02一個(gè)字節(jié)表示value的類(lèi)型是string,字符串編碼使用的是UTF-8
hello\x00表示以'\0'結(jié)尾的字符串
\x06\x00\x00\x00world\x00:\\x06\x00\x00\x00 前4個(gè)字節(jié)表示以'\0'結(jié)尾的字符串world的長(zhǎng)度
\x00 結(jié)束符
二、數(shù)組
{"BSON": ["awesome", 5.05, 1986]}數(shù)組['red', 'blue']將要編碼為{'0': 'red', '1': 'blue'},key必須按照數(shù)值大小遞增排序(升序)。
也就是["awesome", 5.05, 1986]將被編碼為{ "0":"awesome", "1":5.05,"2":1986}
{"BSON": [ "0":"awesome", "1":5.05,"2":1986]}
對(duì)應(yīng)是
\x31\x00\x00\x00\x04BSON\x00\x26\x00\x00\x00\x02\x30\x00\x08\x00\x00\x00awesome\x00\x01\x31\x00\x33\x33\x33\x33\x33\x33\x14\x40\x10\x32\x00\xc2\x07\x00\x00\x00\x00解釋每一行的意思
\x31\x00\x00\x00:
4個(gè)字節(jié)表示文檔的大小,x31的10進(jìn)制是49,這個(gè)文檔的大小是49個(gè)字節(jié)
\x04BSON\x00:
\x04表示value的類(lèi)型是數(shù)組表示的document
BSON\x00 表示以'\0'結(jié)尾的字符串
\x26\x00\x00\x00 :
4個(gè)字節(jié)表示數(shù)組的大小即中括號(hào)的內(nèi)容,x26的10進(jìn)制是38
\x02\x30\x00\x08\x00\x00\x00awesome\x00:
\x02 表示value的類(lèi)型是string
x30表示key,字符0的ASCII碼是48,16進(jìn)制是x30
縱向看正好是x30,x31,x32
\x08\x00\x00\x00 4個(gè)字節(jié)表示awesome\x00 長(zhǎng)度
\x01\x31\x00\x33\x33\x33\x33\x33\x33\x14\x40:
\x01
表示64位的二進(jìn)制浮點(diǎn)數(shù)
x31\x00表示以'\0'結(jié)尾的字符串1,字符1的ASCII碼是x31
x33\x33\x33\x33\x33\x33\x14\x40
double的5.5轉(zhuǎn)換成16進(jìn)制為40 14 33 33 33 33 33 33
\x10\x32\x00\xc2\x07\x00\x00:\x10表示32位的整數(shù)。\x32\x00表示以'\0'結(jié)尾的字符串2,字符2的ASCII碼是x32
\xc2\x07\x00\x00也就是16進(jìn)制的7c2轉(zhuǎn)換成10進(jìn)制是1986
最后兩行的\x00 \x00:結(jié)束符。
總結(jié):看完了這個(gè)介紹,你有什么感覺(jué)?真香。寫(xiě)起來(lái)太麻煩了,看到這個(gè)有點(diǎn)像莫斯密碼了,頭大了,還是Json寫(xiě)起來(lái)簡(jiǎn)單。
但是Bson在存儲(chǔ)上來(lái)說(shuō)比json更輕量級(jí)。
五、Bson的一些API介紹
我這里只做了兩張圖,如下所示:
Bson接口圖解1 Bson接口圖解2總結(jié)
以上是生活随笔為你收集整理的Bson类似于Protocol Buffer的数据形式,比json更轻量级更高效的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ARM核心板应用案例-飞凌嵌入式智慧交通
- 下一篇: Pointofix下载、安装和使用快捷键