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