无法反序列化通过TCP接收的Flatbuf消息

时间:2019-02-04 16:36:20

标签: c++ flatbuffers

我正在尝试序列化,然后反序列化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”对象的函数。

我在做什么错?如何正确反序列化?

1 个答案:

答案 0 :(得分:2)

请确保您使用assert进行测试(在“调试”模式下),因为它已经回答了您的问题。特别是:

  • 您正在未完成的缓冲区(通常会断言)上调用GetBufferPointer。您需要致电fbb.Finish(thisPacket)或类似电话。
  • 您正在表构建器(通常会断言)中调用CreateString,并在其外部创建了不使用的字符串。大概是您打算改打strbuilder.add_stringdata(thisStringData)