「CBOR — Concise Binary Object Representation | Overview」
スッキリシンプルなCBORオフィシャルサイト。挙げられている特徴は3つ。
- JSON同様スキーマレスなデータ構造 - Protocol Buffersはスキーマが必要
- 暗号鍵や画像などバイナリ対応 - 大容量データの高速処理が可能
- 標準仕様(RFC 8949)と許諾不要の拡張性 - 日本発のMessagePackが元!
早速実装を見てみると、JavaScript版cbor-jsがありましたが、実装が古くvarまみれ、ESモジュールに対応していないため、forkしてCBOR-esを作成しました。
「code4fukui/CBOR-es: The Concise Binary Object Representation (CBOR) data format (RFC7049) implemented in pure JavaScript (ES Module). CBOR.js」
使い方は簡単!
遭遇し、回避・解決したバグ2つ
1. 元のcbor-jsでは、JSONとArrayBufferの相互変換でしたが、DenoのreadFileではArrayBufferとUint8Arrayのサイズが合わない問題があり、取り回しやすさを踏まえてCBOR-esでは、JSONとUint8Arrayの相互変換に変更。
2. utf8の文字列処理のバグ、cbor-jsは文字列からutf8への変換に独自コードを使っていましたが全角アルファベットなど一部日本語が化ける現象に遭遇。TextEncoder/TextDecoderを使う実装に変更しました。
「地域情報化アドバイザーオープンデータ」のCSVデータを、CBORに変換した .csv.cbor ファイル、JSONにした上でCBORに変換した .cbor ファイル、JSONファイルとそれぞれ作って、ファイルサイズとデコード時間を比較した結果です。
CSVとCBOR/CSVはファイルサイズも速度もほぼ一緒。ライブラリが小さい分CBORが良さそう。JSONをCBORにするとファイルサイズが若干減りますが、ネイティブのパーサーが速すぎるという結果となりましたが、いずれも十分実用範囲です。
CBOR(シーボル)バイナリデータを気軽に扱うには良さそうですね!