ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 구글 플랫버퍼(flatbuffers) 맛보기 in c++
    프로그래밍/c++ 2017. 11. 30. 12:43
    반응형

    플랫버퍼란?

    구글의 크로스 플랫폼 직렬화 라이브러리이다. 빠르고 사용하기 편리하다.

    c, c++, c#, go, java, js, php, python 언어를 지원한다.

     

    간단한 사용법

    1. 스키마 파일을 작성한다.
    2. 스키마 파일을 컴파일한다. 컴파일하면 언어에서 사용될 파일들이 생성된다.
    3. FlatBufferBuilder 이용해 플랫한 바이너리 버퍼를 생성한다. 컴파일된 파일들을 포함하면 손쉽게 바이너리 버퍼를 만들 있다.
    4. 바이너리 버퍼를 저장하거나, 보내거나 한다.


    시작하기

     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

    반응형
Designed by Tistory.