Swift
FlatBuffers

SwiftでFlatBuffersを使ってみる

More than 1 year has passed since last update.


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で使ってみる