在 Protocol Buffer 中,通常需要从文件或流中读取或写入多条消息。为了确保正确处理消息边界,可以在每个消息之前添加长度前缀。从版本 2.1.0 开始,Java API 提供了一组“分隔”I/O 函数(parseDelimitedFrom、mergeDelimitedFrom 和 writeDelimitedTo)来促进此过程。
C 等效项
从 Protobuf 版本 3.3.0 开始,有 C 等效项Java API 中的分隔 I/O 函数。这些函数可以在以下头文件中找到:
google/protobuf/util/delimited_message_util.h
函数如下:
bool writeDelimitedTo(const google::protobuf::MessageLite& message, google::protobuf::io::ZeroCopyOutputStream* rawOutput); bool readDelimitedFrom(google::protobuf::io::ZeroCopyInputStream* rawInput, google::protobuf::MessageLite* message);
实现
以下C 和 Java protobuf 库的作者提供了 C 分隔 I/O 函数的优化实现。它们解决了替代实现中发现的一些问题:
bool writeDelimitedTo(const google::protobuf::MessageLite& message, google::protobuf::io::ZeroCopyOutputStream* rawOutput) { // ... } bool readDelimitedFrom(google::protobuf::io::ZeroCopyInputStream* rawInput, google::protobuf::MessageLite* message) { // ... }
这些实现包括最小化副本并避免处理大量数据后潜在错误的优化。此外,与其他实现不同的是,这些函数对每条消息而不是整个流强制执行大小限制。
以上是如何在 C 协议缓冲区中实现定界 I/O 功能?的详细内容。更多信息请关注PHP中文网其他相关文章!