是每个缓冲区或整个程序的大小前缀吗?

时间:2019-04-11 06:42:12

标签: c++ serialization flatbuffers

我正在通过网络流式传输平面缓冲区,因此每个缓冲区的大小都以FinishSizePrefixedFoo(fbb, msg)为前缀,但是我注意到此大小前缀不是消息结构msg的大小,而是大小整个缓冲区构建器。例如:

flatbuffers::FlatBufferBuilder fbb;
flatbuffers::Offset<Message> msg;
msg = sge::sgedm::CreateMessage(fbb, ...);
FinishSizePrefixedMessageBuffer(fbb, msg);
flatbuffers::uoffset_t len = flatbuffers::ReadScalar<flatbuffers::uoffset_t>(fbb.GetBufferPointer());
std::cout << "Buffer size is " << fbb.GetSize() << " size prefix is " << len << std::endl;
flatbuffers::Offset<Message> msg2;
msg2 = sge::sgedm::CreateMessage(fbb, ...);
FinishSizePrefixedMessageBuffer(fbb, msg2);
len = flatbuffers::ReadScalar<flatbuffers::uoffset_t>(fbb.GetBufferPointer());
std::cout << "Buffer size is " << fbb.GetSize() << " size prefix is " << len << std::endl;

输出为:

Buffer size is 84 size prefix is 80
Buffer size is 168 size prefix is 164

但是预期的输出是:

Buffer size is 84 size prefix is 80
Buffer size is 168 size prefix is 80

否则,无法将两条消息分开。

我正在使用此大小前缀进行验证程序和反序列化,例如:

buf[4] = recv(4);
uoffset_t len = ReadScalar(buf);
buf[4..len+4] = recv(len);
msg = GetSizePrefixedMessage(buf);

当我读取大小为164的消息时,预期会出现一条大小为164的消息,而实际上是两条消息,每个消息均为80字节。这是flatbuffers的错误吗?

1 个答案:

答案 0 :(得分:0)

请确保您使用asserts进行开发,因为这已经告诉您上述代码不正确。

在构建器上调用Finish时,除非调用Clear,否则无法在其中序列化更多数据。因此,在这种情况下,第二个缓冲区也包含第一个缓冲区的副本。肯定会告诉你的。

当然,如果要轻松地使两个缓冲区都可用,则还可以使用2个FlatBufferBuilder实例。