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

Unable to deserialize flatbuf messages received through TCP

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

我做错了什么?我怎样才能正确反序列化它?

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

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