Невозможно десериализовать сообщения flatbuf, полученные через 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'.

Что я делаю неправильно? Как я могу правильно десериализовать это?

1 ответ

Решение

Пожалуйста, убедитесь, что вы тестируете с включенными утверждениями (в режиме "отладки"), так как он уже ответил бы на ваши вопросы. Особенно:

  • Ты звонишь GetBufferPointer на незаконченном буфере (который обычно утверждает). Вам нужно позвонить fbb.Finish(thisPacket) или похожие.
  • Ты звонишь CreateString внутри конструктора таблицы (который обычно утверждается), и вы создаете строку вне нее, которую вы не используете. Предположительно, вы намеревались позвонить strbuilder.add_stringdata(thisStringData) вместо.
Другие вопросы по тегам