flatbuffersを試している。1つのスキーマで各言語でシリアライズ・デシリアライズ出来るが、ちょっとクセがあるのでメモ。
言語の対応
PythonはGoogle謹製の flatbuffers
を使用する。これは C言語のジェネレータを生成できない。
C言語を使用する場合、スキーマを互換して取り扱える flatcc
を使用する。
エンコードとデコードのメモ
まだ理解しきれていない点あるのでほんとにメモだけ。特にC言語の挙動はよく理解できていない。以下のコードを参考にしている。
C言語(flatcc)
トップダウン・アプローチとボトムアップ・アプローチがあるのが興味深い。前者はルートテーブルから作成、後者は内包するサブテーブルから作成するアプローチとなっている。書きやすい方で良いと思う。
Python
こちらのコードはボトムアップ・アプローチとなっている。
その他
C言語とPythonで同じデータをエンコードした場合、 出力されるバイナリ値は同じ値にならない 。しかし、どちらのバイナリも問題なくデコードすることが出来る(私がFlatBuffersの内部構造を把握していないので原因はわかってない。整合性が取れる形でテーブルが格納されているのでしょう)。 これは私の勘違いでした (2023/02/17追記)
tips
テーブル、フィールドを追加するときは最後尾に
テーブルやフィールドを追加するときは最後尾に追加する。前方に追加すると自動生成したコードのenum値がズレてしまい、互換性が壊れる。