🌐FlatBuffersとProtocol Buffersの違い
プロトコルバッファはFlatBuffersと比較的似ていますが、
JSONとの比較
Cap'n ProtoやSBEと同様に「ゼロコピー」デシリアライゼーションをサポートしており、シリアル化されたデータにアクセスする際に、最初にメモリの別の部分にコピーする必要がありません。このため、これらのフォーマットのデータへのアクセスは、JSONやCSV、そして多くの場合プロトコルバッファのような、より広範な処理を必要とするフォーマットのデータよりもはるかに高速です。
シリアル化されたフォーマットにより、すべてのデータを解析することなく、特定のデータ要素(例えば、個々の文字列や整数のプロパティ)にランダムにアクセスすることができます。可変長の整数を使用するプロトコルバッファとは異なり、FlatBuffersでは整数をネイティブサイズでエンコードするため、パフォーマンスに有利ですが、エンコードされた表現が長くなります。
スキーマは名前空間宣言から始まります。これは生成されるコードに対応するパッケージ/名前空間を決定するものです。この例では、MyGame ネームスペースの中に Sample ネームスペースがあります。
FlatBuffersとProtocol Buffers(Protobuf)は、両方ともGoogleが開発したデータのシリアライズ(直列化)形式で、ネットワーク経由でのデータの送受信やファイルへのデータの保存などで使用されます。しかし、その特性と利用場面にはいくつか違いがあります。
Protocol Buffers (Protobuf): Protocol Buffersは、効率的で拡張可能なメカニズムを提供し、構造化データを簡単にシリアライズ(直列化)できるように設計されています。それはバイナリ形式であり、シリアライズとデシリアライズの過程で一部のCPUリソースを消費しますが、生成されるデータは通常小さく、またネットワーク経由で送信する際の帯域幅も少なくて済みます。また、異なるデータ構造間で互換性を保つための機能も提供しています。
FlatBuffers: FlatBuffersもまた、Protocol Buffersと同様にデータをシリアライズするためのものですが、その主な特徴は「ゼロコピー」のデシリアライズです。FlatBuffersが生成するデータはメモリに直接マッピングされ、そのデータを解析するためにはデータのコピーを作成する必要がありません。これにより、デシリアライズの過程でのCPUリソースの使用を削減し、パフォーマンスを向上させることができます。また、生成されるデータは通常Protobufよりも大きいですが、高速なアクセスが必要なゲーム開発やリアルタイムシステムなどでは、その性能の利点が活かされます。
インストール: まず、FlatBuffersコンパイラとランタイムライブラリをインストールします。GitHubのFlatBuffersリポジトリからソースコードをダウンロードしてビルドするか、パッケージマネージャー(例: apt-get、brew、vcpkg など)を使ってインストールできます。
スキーマ定義: データ構造を定義するためのスキーマファイル(.fbsファイル)を作成します。このファイルには、シリアル化/デシリアル化するためのテーブル、構造体、および他のデータタイプが定義されます。
namespace MyGame.Sample;
table Monster {
pos:Vec3;
mana:int;
hp:int;
name:string;
friendly:bool;
inventory:[ubyte];
}
root_type Monster;
コード生成: FlatBuffersコンパイラ(flatc)を使って、スキーマファイルからターゲット言語のコードを生成します。
--binary, -b
任意のデータ定義に対してワイヤーフォーマットのバイナリーを生成する。
--json, -t
データ定義に対してテキスト出力を生成する。
--cpp, -c
テーブル/構造体の C++ ヘッダーを生成する。
--go, -g
テーブル/構造体のGoファイルを生成する。
--java, -j
テーブル/構造体用のJavaクラスを生成する。
--dart, -d
テーブル/構造体に Dart クラスを生成する。
--ts, -T
テーブル/構造体にTypeScriptコードを生成する。
--csharp, -n
テーブル/構造体用の C# クラスを生成する。
--python, -p
テーブル/構造体用の Python ファイルを生成する。
--lobster
テーブル/構造体用の Lobster ファイルを生成する。
--lua, -l
テーブル/構造体用のLuaファイルを生成する。
--rust, -r
テーブル/構造体に Rust ファイルを生成する。
--php
テーブル/構造体用の PHP ファイルを生成する。
--kotlin
テーブル/構造体にKotlinクラスを生成する。
--jsonschema
Json スキーマを生成する。
--swift
テーブル/構造体用の Swift ファイルを生成する。
--nim
テーブル/構造体のNimファイルを生成する。
-o PATH
生成されるファイルの先頭に PATH を付ける。
-I PATH
指定したパスでインクルードを検索する。
-M
生成されるファイルに make(1) のルールを表示する。
お願い致します