iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 14
1
AI & Data

資料工程師修煉之路系列 第 14

[Day 14] Encoding and Evolution(2) - Json, XML, CSV 和 Binary variants (二進制變體)

接續 Day 13

JSON, XML, CSV 和 Binary Variants (二進制變體)

JSON, XML, CSV 都是很廣泛為人知、多人使用、支援工具很多的 encoding 格式,但不喜歡的人也不少,XML 常常被詬病它的複雜性,不必要的資訊太多了,相較之下 JSON 就比較好懂了,在許多的 web 應用系統中也是內建 JSON 在裡頭,而 CSV 雖然沒這麼強,但它是很多檔案交換時用的格式。

JSON, XML, CSV 都是人肉眼看的懂的文字格式 (XML 就...),儘管他們流行,但還是可能會有以下幾個微妙的問題:

  • 它們對數字的 encoding 很模糊,比如在 XML 和 CSV,你不曉得這個欄位究竟是數字還是文字 (除非你有另外對欄位設計額外的 schema);而 JSON 雖然區分的出來,但 JSON 無法區分是整數還是浮點數 (因為未指定精度),這個問題會造成當你數字大於 https://chart.googleapis.com/chart?cht=tx&chl=2%5E%7B53%7D 時不能表示成 IEEE 754 雙精度浮點數,簡單說就是用 javascript 解析該數字會有不正確結果。
  • 它們不支援 binary strings 格式,JSON, XML 因為都是人看得懂的內容,所以對 Unicode 有良好的支援,可是若你欄位想存純粹的 binary 內容進去就不行了,你只能把 binary 轉成 Base64-encoded 字串後才能存,但這樣會增加差不多 33% 的大小。
  • JSON, XML 雖然也支援 schema,但大多數的主流工具都不會實做。
  • CSV 不支援 schema,所以應用程式需知道自己在讀什麼;另外 CSV 對逗號和換行符號這事很敏感,雖然 CSV 的規格上有規定遇到某些特殊字元該如何處理,但不是所有的解析器都會乖乖實做。

雖然如此,它們在很多資料交換情況下也是相當方便的。

Binary Encoding (二元編碼)

想像一下你需要在內部做 TB 等級的資料交換時,你會直接用 JSON 當文字檔案儲存後給別人用嗎?如果你是用雲端儲存資源,小小的改變也能幫你節省非常多的資料大小,Binary Encoding 就是幫助我們省節資源用的方法;JSON 跟 XML 都有許多 Binary Encoding 的工具,JSON 有 MessagePack, BSON, BJSON, UBJSON, BISON 等等,XML 也有 WBXML, Fast Infoset 等等,

因為 JSON 和 XML 不會特別指定 schema,代表我們在做 Binary Encoding 時勢必要存欄位名稱,以下這串 JSON 為之後所有 encoding 格式的範例:

JSON Example 4-1

{
    "userName": "Martin",
    "favoriteNumber": 1337,
    "interests": ["daydreaming", "hacking"]
}

就來看 MessagePack 怎麼做 Binary Encoding 的吧!

figure_4-1

首先要知道的是圖中的內容皆為 16 進位,再來就一步步解析吧!

  1. 第 1 個位元組 0x83 代表接下來的資料是個物件 (前 4 個位元 = 0x80),然後裡頭有 3 個欄位 (後 4 個位元= 0x03)。(若超過 15 個欄位會有不同的表達方式,就自己查文件吧XD)
  2. 在來第 2 個位元組 0xa8 代表接下來會有個字串 (前 4 個位元 0xa0 ),然後長度為 8 個位元組 (後 4 個位元 0x08)。
  3. 所以在來就是 8 個位元組 存 userName (使用 ASCII),這裡不需要一個表達字串結束的字元。
  4. 再來 0xa6 也是跟第 2 步一樣意思,有個字串長度為 6 位元組 ,後面就是造著這邏輯把檔案寫完了。

經過 MessagePack 的 binary encoding 後的大小為 66 位元組,比純粹把 JSON 當文字儲存後的 81 位元組 來的小 (移除空白),所有的 JSON binary encoding 做法都差不多,但明天要講的 encoding 格式檔案大小就只剩 32 位元組 了。


上一篇
[Day 13] Encoding and Evolution(1)
下一篇
[Day 15] Encoding and Evolution(3) - Thrift and Protocol Buffers
系列文
資料工程師修煉之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言