Skip to content

CBOR

CBORは、JSONに似たバイナリ交換のための標準フォーマットです。 JSONよりも高速で小さく、より多くのデータ型をエンコードすることができます。 特に、バイナリデータはbase-64などでエンコードすることなくシリアライズすることができる。 これらの特性から、状態ファイルの保存やIPCなどに有用である。

情報保存のためのCBORの欠点もある。

  • プロパティ属性や継承をサポートしない。
  • DAGやループグラフがない。
  • プロパティを持つ配列オブジェクトは、そのインデックス以外のプロパティを失います。
  • ギャップを持つ配列オブジェクトは、未定義として読み返されると、そのギャップが失われます。
  • バッファオブジェクトとビューは、生データ以外の多くの詳細を失います。
  • ECMAScript の文字列は完全に表現することができません。
  • 関数とネイティブオブジェクトは、その詳細のほとんどを失います。
  • CBORタグはソフトデコードの情報を提供するのに便利ですが、タグはIANAが管理する空間の単なる整数であり、カスタムタグのためのスペースはありません。 そのため、タグはプライベートな、アプリケーション固有のタグに簡単に使用することはできない。しかし、IANAは少しの努力でカスタムタグを予約することができます。https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml を参照してください。

今後の課題

一般的なことです。

  • エンコード/デコードの動作を制御するフラグを追加する。
  • ストリームの解析が容易になるように、トレイラーを使ったデコードを可能にする。同様の変更は、JSONのデコードにも有用である。
  • CBORタグを欠損値用に確保する。
  • その他の必要なCBORタグを確保する。
  • 副作用のあるエンコードと副作用のないエンコードを明示的にサポート (例: Proxy traps と getters のスキップ)。
  • JSONエンコーディングは.toJSON()をサポートし、.toCBOR()のようなものをサポートするかも?
  • エンコードとデコードをより最適化する。

エンコーディング。

  • 型付き配列のタグ付け: https://datatracker.ietf.org/doc/draft-ietf-cbor-array-tags/.ミックスエンディアンタグが存在しないため,ミックスエンディアンをリトルエンディアンに変換する必要があります.
  • 型付き配列を整数配列としてエンコードする?
  • Float16Array エンコーディングのサポート (メインエンジンでサポートされた場合)。
  • IANA の予約が完了したら、配列のギャップのタグ付けを行います。https://github.com/svaarala/duktape/blob/master/doc/cbor-missing-tag.rst。
  • エンコーディング時に64ビット整数をサポート(例:2^53まで?
  • オブジェクトが23個以上のキーを持つ場合でも、確定長のオブジェクトエンコードが可能です。
  • Map/Setエンコーディング(一度メインエンジンでサポートされた)、多分Map/Setにデコードバックするようにタグ付け。
  • Bigintエンコーディング(一度メインエンジンでサポートされた)、Python CBORのようなタグ付きバイト文字列として。
  • 文字列のエンコードオプション:サロゲートペアの結合、UTF-8でないバイト文字列のタグ付け、U+FFFD置換などを使用して、文字列にデコードバックします。
  • シンボルの検出、有用なタグ付けされたフォームでのエンコード。
  • 関数のより良いエンコーディング。
  • シリアライゼーションのフック。呼び出し側がコンテキストに応じた方法で値(特にオブジェクト)をシリアライズできるようにする(例えば、リモートで呼び出せるようにするためにIPCメタデータを持つ関数をシリアライズする)。 このようなフックは、デコード処理のためにカスタム値をマークするタグを発行することができるはずです。

デコード

  • 型付き配列のデコードをサポートします。 デコーダはホストのエンディアンに変換する必要があるか?
  • Float16Arrayのデコードをサポート(メインエンジンでサポートされれば)。
  • 文字列でないキーを持つオブジェクトのデコードは、Mapとして表現される可能性があります。
  • デコード時にベアオブジェクトと配列を使用しますか?
  • デコード時にプレーンオブジェクトではなくMapを使用することで、文字列でないキーを許容します。
  • Bigintのデコード(メインエンジンでサポートされたら)。
  • BMP以外のコードポイントをサロゲートペアにデコードします。
  • コールサイトが安全であることを示すときのシンボルのデコード。
  • 呼び出し元がコンテキストに応じた方法でオブジェクトを復活させるための復活フック (例: シリアル化された関数オブジェクトをIPCプロキシ関数に復活させる)。 このようなフックは、復活が存在するタグに依存できるように、エンコードタグに アクセスできる必要があります。
  • デコードされたオブジェクトと配列をコンパクトにするオプション。
  • 例えば,最適化されていない整数をfastintとしてデコードしたり,互換性の ある浮動小数点値をfastintとしてデコードしたりできます.