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
|