c++ 如何在序列化之前获取协议缓冲区消息的实际大小?

blmhpbnm  于 2023-11-19  发布在  其他
关注(0)|答案(2)|浏览(121)

我在 *.proto文件中定义了一条消息,并使用反射设置了值。我需要找出SerializeToString() API每秒解析多少字节。在调用SerializeToString之前,是否可以获得消息的实际大小?

nhhxz33t

nhhxz33t1#

这取决于你对哪个尺寸感兴趣。
如果你想知道MessageLite::SerializeToString()返回的序列化的protobuf消息有多大,你可以使用Message::ByteSizeLong()
范例:

ExampleMessage msg;
msg.set_example(12);

std::size_t expectedSize = msg.ByteSizeLong();

std::string result;
msg.SerializeToString(&result);

assert(expectedSize == result.size());

字符串
这也是SerializeToString()在内部计算消息大小的方式,以调整std::string的大小,使其有足够的空间容纳整个消息。
另一方面,如果您想知道消息当前以未序列化的形式需要多少内存,可以使用Message::SpaceUsedLong()--它将给予该大小的估计值。
范例:

ExampleMessage msg;
msg.set_example(12);

std::size_t approximateInMemorySize = msg.SpaceUsedLong();

wa7juj8i

wa7juj8i2#

我必须添加更多的信息,因为这是不够的,可能会导致问题。
您的消息没有固定的大小,将根据其数据大小调整大小。例如,我的简单:

message AbstractHeader {
    int32       id = 1;
    MessageType type = 2;
    int32       lenght = 3;
}

字符串
像这样设置:

std::cout << "-> " << wp.ByteSizeLong() << std::endl;
wp.set_id(2147483647);
wp.set_lenght(2147483647);
wp.set_type(Proto::MessageType::ESP32);
std::cout << " byte-> " << wp.ByteSizeLong() << std::endl;
std::string tmpser = "";
wp.SerializeToString(&tmpser);
std::cout << "serialized -> " << tmpser.size() << std::endl;

-> 0
 byte-> 14
serialized -> 14


但如果您设置:

wp.set_id(12);
wp.set_lenght(12);

-> 0
 byte-> 6
serialized -> 6

所以你不能用它作为一个参考端到端的大小,我强烈建议简单的老头类与固定的大小。不完美,但完成工作。

相关问题