2. CBOR Data Models (CBOR データモデル)
CBOR は, その汎用データモデル (Generic Data Model) について明示的です. これは, CBOR で表現できるすべてのデータ項目のセットを定義します. その基本的な汎用データモデルは, "簡易値" (Simple Values) とタグ (Tags) の登録によって拡張可能です. アプリケーションは, 結果として得られる拡張汎用データモデルのサブセットを作成して, 特定のデータモデル (Specific Data Models) を構築できます.
汎用データモデル内のデータ項目を表現できる環境内では, 汎用 CBOR エンコーダとデコーダを実装できます (これには通常, 環境内で自然な表現をまだ持たないデータ項目の追加実装データ型を定義することが含まれます). 汎用エンコーダとデコーダを提供する能力は, CBOR の明示的な設計目標です; ただし, 多くのアプリケーションは, 独自のアプリケーション固有のエンコーダおよび/またはデコーダを提供します.
セクション 3 で定義されている基本的な (拡張されていない) 汎用データモデルでは, データ項目は次のいずれかです:
-
範囲 -2^(64)..2^(64)-1 (両端を含む) の整数
-
0 から 255 の間の数値で識別される簡易値で, その数値自体とは異なるもの
-
整数とは異なる浮動小数点値で, IEEE 754 binary64 で表現可能なセット (非有限値を含む) [IEEE754] からのもの
-
ゼロ個以上のバイトのシーケンス ("バイト文字列", Byte String)
-
ゼロ個以上の Unicode コードポイントのシーケンス ("テキスト文字列", Text String)
-
ゼロ個以上のデータ項目のシーケンス ("配列", Array)
-
ゼロ個以上のデータ項目 ("キー", Keys) からデータ項目 ("値", Values) への数学的関数であるマッピング ("マップ", Map)
-
タグ付きデータ項目 ("タグ", Tag), タグ番号 (範囲 0..2^(64)-1 の整数) とタグコンテンツ (データ項目) で構成される
このモデルでは, 整数値と浮動小数点値は, 同じ数値を持っていても異なることに注意してください.
また, シリアライゼーションのバリアントは汎用データモデルレベルでは可視的ではないことに注意してください. この意図的な不可視性には, エンコードされた浮動小数点値のバイト数が含まれます. また, 整数のエンコーディング, テキスト文字列またはバイト文字列の長さのエンコーディング, 配列内の要素数またはマップ内のペア数のエンコーディング, またはタグ番号のエンコーディングなど, "引数" (argument) のエンコーディングの選択も含まれます (セクション 3 を参照).
2.1. Extended Generic Data Models (拡張汎用データモデル)
この基本的な汎用データモデルは, この文書で次のような多くの簡易値とタグ番号の登録によって拡張されています:
-
"false", "true", "null", および "undefined" (20..23 で識別される簡易値, セクション 3.3)
-
上記よりも大きな範囲と精度を持つ整数および浮動小数点値 (タグ番号 2 から 5, セクション 3.4)
-
RFC 3339 で定義された時点や日付/時刻文字列などのアプリケーションデータ型 (タグ番号 1 と 0, セクション 3.4)
拡張汎用データモデルの追加要素は, CBOR 用に作成された IANA レジストリを介して定義できます (そして定義されています). そのような拡張が汎用エンコーダまたはデコーダに知られていない場合でも, その拡張を使用するデータ項目は, 基本汎用データモデル内のアプリケーションインターフェースで表現することにより, つまり汎用簡易値または汎用タグとして, アプリケーションとの間で渡すことができます.
言い換えれば, 基本汎用データモデルはこの文書で定義されているとおり安定していますが, 拡張汎用データモデルは新しい簡易値またはタグ番号の登録によって拡大しますが, 縮小することはありません.
汎用エンコーダとデコーダが, プログラミング環境に適した形式で "false", "true", および "null" ("undefined" は意図的に省略されています) を表現できるという強い期待がありますが, タグによって作成されたデータモデル拡張の実装は本当にオプションであり, 実装品質の問題です.
2.2. Specific Data Models (特定データモデル)
CBOR ベースのプロトコルの特定データモデルは, 通常, 拡張汎用データモデルのサブセットを取り, このサブセットとそのコンポーネント内のデータ項目にアプリケーションセマンティクスを割り当てます. そのような特定のデータモデルを文書化し, データ項目の型を指定する場合, CBOR 表現の側面 ("主要型 1" (Major Type 1), "主要型 4" (Major Type 4)) を参照するのではなく, 汎用データモデル名 ("負の整数" (Negative Integer), "配列" (Array)) で型を識別することが望ましいです.
特定のデータモデルは, マップキーとエンコーダの自由度の目的で, 値の等価性 (異なる型の値を含む) を指定することもできます. たとえば, 汎用データモデルでは, 有効なマップは "0" と "0.0" の両方をキーとして持つことができ, エンコーダは "0.0" を整数としてエンコードしてはなりません (主要型 0, セクション 3.1). ただし, 特定のデータモデルが整数値の浮動小数点表現と整数表現が等価であると宣言している場合, 単一のマップ内で "0" と "0.0" の両方のマップキーを使用することは, 異なる主要型としてエンコードされていても重複と見なされ, したがって無効です; そしてエンコーダは, エンコードされたバイトを節約するために, 整数値の浮動小数点数を整数としてまたはその逆にエンコードできます.