Carpe Diem

備忘録。https://github.com/jun06t

FlatBuffers を使ってみる

FlatBuffers は ProtocolBuffers の後継として Google が開発したシリアライズライブラリです。 GooglePlay にも使われているそうです。

 

◆事前準備

必要なパッケージをインストールしておきます。

$ sudo aptitude install g++ cmake

ファイルをダウンロードしてきます。

$ git clone https://github.com/google/flatbuffers.git
$ cd flatbuffers/

◆ビルド&インストール

$ cmake -G "Unix Makefiles"
$ make
$ sudo make install

 

スキーマの作成

IDLファイルは *.fbs のファイル名で作成します。 hoge.fbs

namespace Hoge;

table User {
  id:short;
  name:string;
  email:string;
}

root_type User;

今回はGo言語で試そうと思います。ここの table が構造体に値すると考えると楽です。 IDLにも struct はありますが、中身に struct と数値しか使えなかったです。代わりにメモリの使用が少ないらしいです。Vector などお決まりの構造体に使うといいと思います。 使える型の一覧はこちらです。

Writing a schema

 

コンパイルする

$ flatc -g hoge.fbs

すると以下のようなファイルが生成されます。

$ tree
.
├── Hoge
│   └── User.go
├── hoge.fbs
└── test.go

※test.go は動作確認するための実行ファイルです。 この生成されたファイルに定義されているメソッドを使っていきます。

 

◆動作確認

go の flatbuffers のパッケージをインストールしておきます。

$ go get github.com/google/flatbuffers/go

test.go を以下のように作成します。

package main

import (
        "fmt"

        "github.com/google/flatbuffers/go"

        "./Hoge"
)

func main() {
        // write
        builder := flatbuffers.NewBuilder(0)
        Hoge.UserStart(builder)
        Hoge.UserAddId(builder, 10)
        name := builder.CreateString("Amami Haruka")
        Hoge.UserAddName(builder, name)
        email := builder.CreateString("haruka_amami@namco.com")
        Hoge.UserAddEmail(builder, email)
        u := Hoge.UserEnd(builder)
        builder.Finish(u)

        // builder.Bytes are buffers which you can send or receive from somewhere(disk, network). 

        // read
        user := Hoge.GetRootAsUser(builder.Bytes, builder.Head())
        fmt.Println("id: ", user.Id())
        fmt.Println("Name: ", user.Name())
        fmt.Println("Email: ", user.Email())
}

上のコードを見ると分かるのですが、いわゆるシリアライズやデシリアライズの処理がないです。 最初からバッファありのインスタンスを作り、そこに flatc でコンパイルして生成したファイルにある専用のメソッドで値をセット・ゲットしていくため「パッキング/アンパッキングなしで、シリアライズされたデータにアクセス」ということなのでしょう。 実行してみます。

$ go run test.go
id:  10
Name:  Amami Haruka
Email:  haruka_amami@namco.com

きちんと取得出来ました。

 

ソース:

FlatBuffers - Building

Google、FlatBuffersをオープンソース化: 効率の良いクロスプラットフォームのシリアライゼーションライブラリ