1. Qiita
  2. 投稿
  3. Swift

SwiftでFlatBuffersを使ってみる

  • 5
    いいね
  • 0
    コメント
に投稿

FlatBuffersとは

flatbuffers_logo.png
一言で言うと、効率の良いシリアライズライブラリです。

使いたい理由

  • 爆速
  • メモリ効率がいい!
  • JSONはパースめんどくさい!

今回はパフォーマンスの面を省いて(先駆者の方がたくさん書いてくださっているので)実際の使用方法を書きます。

iOSで使いたい

Swift

FlatBuffersSwift
こちらのリポジトリのものを使用します。

使用方法

ダウンロード

まず、githubからソースをダウンロードします。

schemaの作成

FlatBuffersは事前定義ファイルを元にSwiftで使用できるコードを生成することができます。
チュートリアルの様に書いていきましょう。
今回は簡単に人間の例で作っていきます

person.fbs
enum Job:byte { PM = 0, Engineer, Designer = 2 }

table People {
  people:[Person];
}

table Person {
  name:string;
  age:int;
  job:Job;
}

root_type People;

このようにしてエンティティはtableに書きます。
またenumやstruct, unionなども使えるのでProjectによって使い分けてください。
今回は職業をenumで管理しています。

コード生成

READMEに書いてある通り
java -jar fbsCG.jar -fbs person.fbs -out PersonFBS.swift -lang swift
で生成します。
'PersonFBS.swift' has been generated.
と表示されたら完了です。

実際に使う

xcodeでプロジェクトを開き、先ほど生成したPersonFBS.swiftを読み込みます。
そしてViewController.swiftviewDidLoad内で

ViewController.swift
    override func viewDidLoad() {
        super.viewDidLoad()
        //シリアライズ
        let person1 = Person(name: "太郎", age: 21, job: Job.Engineer)
        let person2 = Person(name: "二郎", age: 22, job: Job.Designer)
        let person3 = Person(name: "PMおじさん", age: 35, job: Job.PM)
        let people = People(people: [person1,person2,person3])
        let data = try?people.toData()
        print(data!)
        //デシリアライズ
        let desPerson = People.from(data: data!)
        print((desPerson?.people[0]?.name)!)
        print((desPerson?.people[0]?.age)!)
        print((desPerson?.people[0]?.job)!)
        print((desPerson?.people[1]?.name)!)
        print((desPerson?.people[1]?.age)!)
        print((desPerson?.people[1]?.job)!)
        print((desPerson?.people[2]?.name)!)
        print((desPerson?.people[2]?.age)!)
        print((desPerson?.people[2]?.job)!)
    }

以下logに表示した結果です。

log
140 bytes
太郎
21
Engineer
二郎
22
Designer
PMおじさん
35
PM

このようにして簡単に取り出すことができます。

最後に

FlatBuffersはゲーム開発などでよく使用されています。
JSONに代わるものとして何度か見て来ましたが、あまり使用例がなかったので実際に書いてみました。
APIやJSONの設計上、計算が勿体無いなと思ったら是非使ってみてください。
ただ、少し手間がかかるので
本当にパフォーマンス重視の時に使用するといいかもしれません。

参考

以下、参考にさせていただきました。
FlatBuffersドキュメント
Beyond Json
最速という噂のFlatbuffersの速度のヒミツと、導入方法の紹介(Go)
FlatBuffersをPHPで使ってみる