我在 *.proto文件中定义了一条消息,并使用反射设置了值。我需要找出SerializeToString() API每秒解析多少字节。在调用SerializeToString之前,是否可以获得消息的实际大小?
SerializeToString()
nhhxz33t1#
这取决于你对哪个尺寸感兴趣。如果你想知道MessageLite::SerializeToString()返回的序列化的protobuf消息有多大,你可以使用Message::ByteSizeLong()。范例:
MessageLite::SerializeToString()
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()--它将给予该大小的估计值。范例:
std::string
Message::SpaceUsedLong()
ExampleMessage msg; msg.set_example(12); std::size_t approximateInMemorySize = msg.SpaceUsedLong();
型
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
所以你不能用它作为一个参考端到端的大小,我强烈建议简单的老头类与固定的大小。不完美,但完成工作。
2条答案
按热度按时间nhhxz33t1#
这取决于你对哪个尺寸感兴趣。
如果你想知道
MessageLite::SerializeToString()
返回的序列化的protobuf消息有多大,你可以使用Message::ByteSizeLong()
。范例:
字符串
这也是
SerializeToString()
在内部计算消息大小的方式,以调整std::string
的大小,使其有足够的空间容纳整个消息。另一方面,如果您想知道消息当前以未序列化的形式需要多少内存,可以使用
Message::SpaceUsedLong()
--它将给予该大小的估计值。范例:
型
wa7juj8i2#
我必须添加更多的信息,因为这是不够的,可能会导致问题。
您的消息没有固定的大小,将根据其数据大小调整大小。例如,我的简单:
字符串
像这样设置:
型
但如果您设置:
型
所以你不能用它作为一个参考端到端的大小,我强烈建议简单的老头类与固定的大小。不完美,但完成工作。