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

Unable to deserialize flatbuf messages received through TCP

本文关键字:flatbuf 消息 TCP 反序列化      更新时间:2023-10-16

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

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

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

  • 您正在未完成的缓冲区(通常断言(上调用GetBufferPointer。您需要调用fbb.Finish(thisPacket)或类似电话。
  • 您在表生成器(通常断言(中调用CreateString,并在表生成器外部创建一个不使用的字符串。想必你本来是打算给strbuilder.add_stringdata(thisStringData)打电话的。