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

问题描述 投票:0回答:1

我想序列化,然后反序列化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;
...

我得到0000005,访问冲突阅读位置的未处理的异常... 在该行:

std::cout << "Deserialized Log level: " << get->logLevel()<<std::endl;

或任何时候,当我称之为“得到”对象的功能。

我究竟做错了什么?我怎样才能正确地反序列化呢?

c++ flatbuffers
1个回答
2
投票

请确保您有断言(在“调试”模式)进行测试,因为这已经回答了你的问题。尤其是:

  • 你是一个未完成的缓冲调用GetBufferPointer(通常称)。你需要调用fbb.Finish(thisPacket)或相似。
  • 你是一个表器内调用CreateString(通常称),与您共创它外面一个字符串,你不使用。想必你本来打算叫strbuilder.add_stringdata(thisStringData)代替。
© www.soinside.com 2019 - 2024. All rights reserved.