flatbuffersのメモ

flatbuffersを試している。1つのスキーマで各言語でシリアライズ・デシリアライズ出来るが、ちょっとクセがあるのでメモ。

言語の対応

PythonGoogle謹製の flatbuffers を使用する。これは C言語のジェネレータを生成できない。

C言語を使用する場合、スキーマを互換して取り扱える flatcc を使用する。

エンコードとデコードのメモ

まだ理解しきれていない点あるのでほんとにメモだけ。特にC言語の挙動はよく理解できていない。以下のコードを参考にしている。

C言語(flatcc)

github.com

トップダウン・アプローチとボトムアップ・アプローチがあるのが興味深い。前者はルートテーブルから作成、後者は内包するサブテーブルから作成するアプローチとなっている。書きやすい方で良いと思う。

Python

github.com

こちらのコードはボトムアップ・アプローチとなっている。

その他

C言語Pythonで同じデータをエンコードした場合、 出力されるバイナリ値は同じ値にならない 。しかし、どちらのバイナリも問題なくデコードすることが出来る(私がFlatBuffersの内部構造を把握していないので原因はわかってない。整合性が取れる形でテーブルが格納されているのでしょう)。 これは私の勘違いでした (2023/02/17追記)

tips

テーブル、フィールドを追加するときは最後尾に

テーブルやフィールドを追加するときは最後尾に追加する。前方に追加すると自動生成したコードのenum値がズレてしまい、互換性が壊れる。

参考