この文章は筆者の理解のために書かれたもので、内容の正しさは保証しない。
参考
- https://google.github.io/flatbuffers/flatbuffers_internals.html
- https://github.com/dvidelabs/flatcc/blob/master/doc/binary-format.md#flatbuffers-binary-format
バッファはroot tableで表される uoffset_t から開始される。
現在の実装では、バッファを逆向きに構築する。
uoffset_t- 基本は
uint32_t - signedな
soffset_tも存在する
- 基本は
voffset_tuint16_t
その他のプリミティブ型は https://github.com/dvidelabs/flatcc/blob/master/doc/binary-format.md#primitives
Enumを定義した際に与えたunderlying typeとなる。
flatcでは、tableのenumフィールドにデフォルト値を与えると、そのフィールド値がデフォルト値の場合にvtableの値が0になるので注意(実装依存?)。
unionの値が設定されていないことを表すenum値である NONE が予約されている。
| 型 | 説明 |
|---|---|
| enum representing the union choice | どの型が含まれているか |
| uoffset_t | 実際の値へのオフセット |
- 親にインラインで格納されるのではなく そのアドレスからの オフセットで参照される
- 例: vectorが 0x38 に格納されており、そのデータが 0x0c ならば実データは 0x38 + 0x0c = 0x44 に格納される
- Stringsはbyte型のVectorsであり、常にnull終端である。
| 型 | 説明 |
|---|---|
| 32bit element count | null終端を含まない要素数 |
| scalar | 要素 |
| ... | ... |
- 自身がその親に直接格納される
- コンポーネントはそのサイズでアラインされる
- Structsは最大のスカラメンバーにアラインされる
- 定義順に値が格納される
- Structsとは異なり、親にインラインで格納されるのではなくオフセットで参照される
| 型 | 説明 |
|---|---|
| soffset_t | vtableへのオフセット。オブジェクトの開始位置から減算される |
| scalar or uoffset_t | アラインされたフィールドの値。順序が決まっておらずすべてのフィールドが存在する必要はない。 |
| ... | ... |
フィールドへはvtableを用いてアクセスする。vtableの構造は以下の通り。
| 型 | 説明 |
|---|---|
| voffset_t | vtableのバイト単位のサイズ(この要素を含む)。バリデーションに使われる。 |
| voffset_t | オブジェクトのサイズ(vtable offsetを含む) |
| voffset_t | フィールドへのオフセット値。範囲外または0の場合は、フィールドの値が存在しないことを表す。 |
| ... | 上の要素がN個続く。Nはフィールド数。 |
- フィールドに初期値が設定されているときにvtableのその要素がスキップされる?