-
구글 플랫버퍼(flatbuffers) 맛보기 in c++프로그래밍/c++ 2017. 11. 30. 12:43반응형
플랫버퍼란?
구글의 크로스 플랫폼 직렬화 라이브러리이다. 빠르고 사용하기 편리하다.
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 builderauto 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
반응형'프로그래밍 > c++' 카테고리의 다른 글
c++에서 리플렉션 흉내내기 (0) 2018.01.03 asio 기반으로 라이브러리 프로토타입을 만들었다. (0) 2017.12.24 c++로 텍스트 파일 쓸 때 참고 (0) 2017.06.15 c++에서 람다를 함수 인자로 쓸 때 적절한 방법 (0) 2016.10.15 boost::variant(std::variant c++17) 사용하기 (4) 2016.08.05