无法反序列化通过 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)
。
我正在尝试序列化,然后反序列化 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)
。