flatbuffers02

flatbuffers¿¡¼­ unionÀ» ÀÌ¿ëÇϸé ŸÀÔÀ» ±¸ºÐ ÇÒ ¼ö ÀÖ´Ù.
flatbuffersÀÇ unionÀº enum°ú C¾ð¾îÀÇ unionÀ» ¹ö¹«¸°°Í°ú ºñ½ÁÇÏ´Ù.
ÆÐŶÀÇ Å¸ÀÔÀ̳ª À̺¥Æ® ŸÀÔµî ¿©·¯°³ÀÇ ±¸Á¶Ã¼¸¦ »ç¿ëÇÑ´Ù¸é unionÀ» »ç¿ë Çϴ°ÍÀÌ ÁÁ´Ù.

IDL ÀÛ¼º

¿©±â¼­´Â EventStart, EventEnd µÎ°¡Áö À̺¥Æ® ŸÀÔÀ» »ç¿ëÇÏ°í ÀÖ´Ù.

namespace MyEvent; 

table EventStart

  id : int; 
  time : float;


table EventEnd 

  id : int;
  message : string;


union EventCmd { EventStart, EventEnd } 

table EventHolder

  event : EventCmd; 


root_type EventHolder; 

union ÀÚü·Î ¸¸µéÁö ¸øÇϱ⠶§¹®¿¡ EvnetHolder Å×ÀÌºí¿¡  event º¯¼ö·Î ÁöÁ¤ Çß´Ù.

union Á÷·ÄÈ­ ¿¹

MyEvent::CreateEventHolder(builder, MyEvent::EventCmd_EventStart,  startOffset.Union());

Finish ´ë½Å FinishSizePrefixed ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é ¹öÆÛ ¾Õ¿¡ 4byteÀÇ ¹öÆÛÀÇ Å©±â¸¦ Ãß°¡ ÇÑ´Ù.
³ªÁß¿¡ ¿ªÁ÷·ÄÈ­ ÇÒ¶§ ¾ÕÀÇ µ¥ÀÌÅÍ 4byte·Î Å©±â¸¦ ÀÐ°í ³ª¸ÓÁö´Â Å©±â¸¸Å­ µ¥ÀÌÅ͸¦ ÀÐÀ¸¸é µÈ´Ù.

FinishSizePrefixed·Î ¸¸µé¾îÁø flatbuffers ¹öÆÛ´Â °Ë»çµµ VerifySizePrefixedEventHolderBuffer·Î  ÇÑ´Ù.
¹öÆÛ ¾ÕÀÇ 4¹ÙÀÌÆ®¸¦ Á¦°ÅÇϸé VerifyEventHolderBuffer·Î °Ë»ç ÇÑ´Ù.

EventStart, EventEnd¸¦ Á÷·ÄÈ­ ÇÑ´Ù.

void UnionSample_Satart(int id, float startTime)
{
    flatbuffers::FlatBufferBuilder builder;

    //Á÷·ÄÈ­ serialize
    auto startOffset = MyEvent::CreateEventStart(builder, id, startTime);
    auto rootOffset = MyEvent::CreateEventHolder(builder, MyEvent::EventCmd_EventStart, startOffset.Union());
   
    builder.FinishSizePrefixed(rootOffset);
   
    auto data = builder.GetBufferPointer();
    auto bufSize = builder.GetSize();

    flatbuffers::Verifier verifier(data, bufSize);
    bool ok = MyEvent::VerifySizePrefixedEventHolderBuffer(verifier);
    if (ok)
    {
        DeserializeUnion(data);
    }
}

void UnionSample_End(int id, std::string msg)
{
    flatbuffers::FlatBufferBuilder builder;

    //Á÷·ÄÈ­ serialize
    auto offset = MyEvent::CreateEventEnd(builder, id, builder.CreateString(msg.c_str()));
    auto rootOffset = MyEvent::CreateEventHolder(builder, MyEvent::EventCmd_EventEnd, offset.Union());

    builder.FinishSizePrefixed(rootOffset);

    auto data = builder.GetBufferPointer();
    auto bufSize = builder.GetSize();

    flatbuffers::Verifier verifier(data, bufSize);
    bool ok = MyEvent::VerifySizePrefixedEventHolderBuffer(verifier);
    if (ok)
    {
        DeserializeUnion(data);
    }
}

union ¿ª Á÷·ÄÈ­

unionÀÇ Å¸ÀÔÀ» üũ ÇÏ´Â ¹æ¹ýÀº ´ÙÀ½°ú °°´Ù.

union ŸÀÔ À̸§ = "union º¯¼ö À̸§" + "_type( )"
eventHolder->event_type() = eventHolder->event + _type( )

        auto eventHolder = MyEvent::GetEventHolder(data+(bufSize-prefixedSize));
        if (eventHolder->event_type() == MyEvent::EventCmd_EventStart)

¹öÆÛ¸¦ ÇØ´ç ŸÀÔÀ¸·Î º¯È¯ÇÏ´Â ¹æ¹ýÀº ´ÙÀ½°ú °°´Ù.

º¯È°ÇÒ Å¸ÀÔ º¯¼ö = "union º¯¼ö À̸§" + "_as" + <º¯È¯ÇÒ Å¸ÀÔ>( )
const MyEvent::EventStart* e = eventHolder->event_as<MyEvent::EventStart>( )

const MyEvent::EventStart* e = eventHolder->event_as<MyEvent::EventStart>();

¿ª Á÷·ÄÈ­ ÄÚµå´Â ´ÙÀ½°ú °°´Ù.

void DeserializeUnion(uint8_t* data)
{
    int deBufSize = data[0];
    flatbuffers::Verifier verifier1(data + 4, deBufSize);
    bool res = MyEvent::VerifyEventHolderBuffer(verifier1);
    if (res)
    {
        auto eventHolder = MyEvent::GetEventHolder(data + 4);
        if (eventHolder->event_type() == MyEvent::EventCmd_EventStart)
        {
            const MyEvent::EventStart* e = eventHolder->event_as<MyEvent::EventStart>();
            std::cout << "MyEvent::EventStart  " << "¾ÆÀ̵ð : " << e->id() << std::endl;
            std::cout << "MyEvent::EventStart  " << "ŸÀÓ : " << e->time() << std::endl;
        }
        else if (eventHolder->event_type() == MyEvent::EventCmd_EventEnd)
        {
            const MyEvent::EventEnd* e = eventHolder->event_as<MyEvent::EventEnd>();
            std::cout << "¾ÆÀ̵ð : " << e->id() << std::endl;
            std::cout << "ŸÀÓ : " << e->message()->c_str() << std::endl;
        }
    }
}


Àüü ÄÚµå´Â ´ÙÀ½°ú °°´Ù.
#include <iostream>
#include "flatbuffers/flatbuffers.h"
#include "event_generated.h"

void DeserializeUnion(uint8_t* data)
{
    int deBufSize = data[0];
    flatbuffers::Verifier verifier1(data + 4, deBufSize);
    bool res = MyEvent::VerifyEventHolderBuffer(verifier1);
    if (res)
    {
        auto eventHolder = MyEvent::GetEventHolder(data + 4);
        if (eventHolder->event_type() == MyEvent::EventCmd_EventStart)
        {
            const MyEvent::EventStart* e = eventHolder->event_as<MyEvent::EventStart>();
            std::cout << "MyEvent::EventStart  " << "¾ÆÀ̵ð : " << e->id() << std::endl;
            std::cout << "MyEvent::EventStart  " << "ŸÀÓ : " << e->time() << std::endl;
        }
        else if (eventHolder->event_type() == MyEvent::EventCmd_EventEnd)
        {
            const MyEvent::EventEnd* e = eventHolder->event_as<MyEvent::EventEnd>();
            std::cout << "¾ÆÀ̵ð : " << e->id() << std::endl;
            std::cout << "ŸÀÓ : " << e->message()->c_str() << std::endl;
        }
    }
}

void UnionSample_Satart(int id, float startTime)
{
    flatbuffers::FlatBufferBuilder builder;

    //Á÷·ÄÈ­ serialize
    auto startOffset = MyEvent::CreateEventStart(builder, id, startTime);
    auto rootOffset = MyEvent::CreateEventHolder(builder, MyEvent::EventCmd_EventStart, startOffset.Union());
   
    builder.FinishSizePrefixed(rootOffset);
   
    auto data = builder.GetBufferPointer();
    auto bufSize = builder.GetSize();

    flatbuffers::Verifier verifier(data, bufSize);
    bool ok = MyEvent::VerifySizePrefixedEventHolderBuffer(verifier);
    if (ok)
    {
        DeserializeUnion(data);
    }
}

void UnionSample_End(int id, std::string msg)
{
    flatbuffers::FlatBufferBuilder builder;

    //Á÷·ÄÈ­ serialize
    auto offset = MyEvent::CreateEventEnd(builder, id, builder.CreateString(msg.c_str()));
    auto rootOffset = MyEvent::CreateEventHolder(builder, MyEvent::EventCmd_EventEnd, offset.Union());

    builder.FinishSizePrefixed(rootOffset);

    auto data = builder.GetBufferPointer();
    auto bufSize = builder.GetSize();

    flatbuffers::Verifier verifier(data, bufSize);
    bool ok = MyEvent::VerifySizePrefixedEventHolderBuffer(verifier);
    if (ok)
    {
        DeserializeUnion(data);
    }
}

int main()
{
    UnionSample_Satart(2, 88.8f);
    UnionSample_Satart(5, 3.8f);
    std::cout << "--------------------------" << std::endl;
    UnionSample_End(2, "quit2");
    UnionSample_End(5, "quit5");
    getchar();
}

´Ù¿î·Îµå :  flatbuffer_union_test.zip

Âü°í)
Flatbuffers·Î ¸¸µé¾îÁø ¹ÙÀ̳ʸ® ½Äº° ¹æ¹ý
https://zepeh.tistory.com/576

µ¥ÀÌÅ͸¦ º¸³¾¶§´Â FinishSizePrefixed¸¦ »ç¿ë ¹ÞÀ»¶§´Â 4byte·Î ÆÐŶũ±â¸¦ üũÈÄ ³ª¸ÓÁö¸¦ ¹Þ´Â´Ù.
https://blog.csdn.net/guotianqing/article/details/100691267

union ½ºÅ°¸¶ ¿¹Á¦
https://realtrick.tistory.com/5