
플랫버퍼란?
구글의 크로스 플랫폼 직렬화 라이브러리이다. 빠르고 사용하기 편리하다.
c, c++, c#, go, java, js, php, python 언어를 지원한다.
간단한 사용법
- 스키마 파일을 작성한다.
- 스키마 파일을 컴파일한다. 컴파일하면 각 언어에서 사용될 파일들이 생성된다.
- FlatBufferBuilder를 이용해 플랫한 바이너리 버퍼를 생성한다. 컴파일된 파일들을 포함하면 손쉽게 바이너리 버퍼를 만들 수 있다.
- 바이너리 버퍼를 저장하거나, 보내거나 한다.
시작하기
https://github.com/google/flatbuffers/releases 에서 최신 릴리즈를 받는다.(2017-11-30 기준, 1.8.0) flatc_windows_exe, Source Code 모두 받고 압축을 풀어둔다.
텍스트 파일을 하나 만들어 다음 코드를 타이핑한다.
table PlayerInfo{
name:string;
level:int;
}
root_type PlayerInfo;
playerinfo.fbs 이름으로 flatc.exe와 같은 폴더에 저장한다.
방금 만든 것이 플랫버퍼 idl(인터페이스 정의 언어) 파일이다. idl 파일을 컴파일해보자.
콘솔창을 켠다
cd flatbuffer // 플랫버퍼가 컴파일러(flatc.exe)가 있는 폴더로 이동
flatc --cpp playerinfo.fbs // 컴파일 대상 지정
playerinfo.fbs를 컴파일 했다면
playerinfo_generated.h가 만들어졌을 것이다.
프로그램에서 플랫버퍼로 직렬화 된 데이터 만들기
플랫버퍼 라이브러리를 포함해야한다. flatbuffers-1.8.0 버전으로 받았다면 flatbuffers-1.8.0/include를 프로젝트에 포함하면 된다.
어떤 데이터를 파일에 쓰거나, 네트워크로 보내려면 직렬화가 되어야 한다. 클래스 등을 [aaa][bbb][ccc] 처럼 배열에 담아지는 구조로 만드는 것이다.
#include <flatbuffers/flatbuffers.h>
#include "playerinfo_generated.h"
int main()
{
flatbuffers::FlatBufferBuilder builder
auto name = builder.CreateString("Nelta");
int level = 99;
builder.Finish(CreatePlayerInfo(builder, name, level)); // 직렬화 되었다!
// 직렬화 된 버퍼를 가져온다. 직렬화된 곧바로 네트워크로 보내거나, 저장할 수 있다.
const uint8_t* data = builder.GetBufferPointer();
int level = builder.GetSize();
return 0;
}
직렬화 된 플랫버퍼 데이터 읽기
위에서 직렬화 한 데이터를 파일로 저장하던, 네트워크로 보내던 어딘가에서 받았다면 다음과 같은 처리를 하면 된다,
const PlayerInfo* playerInfo = GetPlayerInfo(data); // 역직렬화
std::string name = playerInfo->name();
int level = playerInfo->level();
테스트 소스
#include <iostream>
#include <flatbuffers/flatbuffers.h>
#include "playerinfo_generated.h"
int main()
{
flatbuffers::FlatBufferBuilder builder
{
auto name = builder.CreateString("Nelta");
int level = 99;
builder.Finish(CreatePlayerInfo(builder, name, level)); // 직렬화 되었다!
}
// 직렬화 된 버퍼를 가져온다. 직렬화된 곧바로 네트워크로 보내거나, 저장할 수 있다.
const uint8_t* data = builder.GetBufferPointer();
int level = builder.GetSize();
PlayerInfo* playerInfo = GetPlayerInfo(data); // 역직렬화
std::string name = playerInfo->name();
int level = playerInfo->level();
std::cout << name << ',' << level << std::endl;
return 0;
}
더 많은 내용을 보려면 공식 래퍼런스에서 확인을 하자!
https://google.github.io/flatbuffers/flatbuffers_guide_writing_schema.html