我正在尝试序列化,然后反序列化FlatBuf对象。
我正在使用FlatBuffer 1.10.0。我想通过TCP将序列化的数据发送到另一个进程,但是目前,即使在相同的功能下,也无法反序列化。
fbs文件:
table StringPacket
{
type:int;
logLevel:int;
myAge:int;
stringdata:string;
}
root_type StringPacket;
C ++中的代码:
...
uint8_t * packet_data;
int data_size;
using namespace flatbuffers;
FlatBufferBuilder fbb;
//serialize the string data
auto thisStringData = fbb.CreateString(m_stringdata);
//create the packet (I tried thisway too)
//auto packet = CreateStringPacket(fbb, 2, 3, 27, thisStringData);
StringPacketBuilder strbuilder(fbb);
strbuilder.add_logLevel(3);
strbuilder.add_myAge(4);
strbuilder.add_type(1);
strbuilder.add_stringdata(fbb.CreateString("somehing"));
auto thisPacket = strbuilder.Finish();
packet_data = fbb.GetBufferPointer();
data_size = fbb.GetSize();
auto get = GetStringPacket(packet_data);
std::cout << "Deserialized Log level: " << get->logLevel()<<std::endl;
std::cout << "Des Age: " << get->myAge() << std::endl;
...
我收到未处理的异常0xC0000005,访问冲突读取位置...
在此行:
std::cout << "Deserialized Log level: " << get->logLevel()<<std::endl;
或者在任何时候调用“ get”对象的函数。
我在做什么错?如何正确反序列化?
答案 0 :(得分:2)
请确保您使用assert进行测试(在“调试”模式下),因为它已经回答了您的问题。特别是:
GetBufferPointer
。您需要致电fbb.Finish(thisPacket)
或类似电话。CreateString
,并在其外部创建了不使用的字符串。大概是您打算改打strbuilder.add_stringdata(thisStringData)
。