Невозможно десериализовать сообщения 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)
вместо.