Java 中 Protocol Buffers 分隔 I/O 函数的 C 等效项
在 C 中,没有与“分隔”I 直接等效的函数/O 函数在 Java 的 Protocol Buffers API 版本 2.1.0 中引入。这些函数允许读取和写入附加长度前缀的多个 Protocol Buffers 消息。
Java 分隔 I/O 函数的连线格式
Java“分隔”I/ O 函数使用 Google 未记录的有线格式。然而,C 和 Java protobuf 库的作者提供了类似功能的非官方实现:
<code class="cpp">bool writeDelimitedTo( const google::protobuf::MessageLite& message, google::protobuf::io::ZeroCopyOutputStream* rawOutput) { // Write the size. const int size = message.ByteSize(); output.WriteVarint32(size); // Serialize the message. uint8_t* buffer = output.GetDirectBufferForNBytesAndAdvance(size); if (buffer != NULL) { message.SerializeWithCachedSizesToArray(buffer); } else { message.SerializeWithCachedSizes(&output); } return true; } bool readDelimitedFrom( google::protobuf::io::ZeroCopyInputStream* rawInput, google::protobuf::MessageLite* message) { // Read the size. uint32_t size; if (!input.ReadVarint32(&size)) return false; // Limit the stream to the size of the message. google::protobuf::io::CodedInputStream::Limit limit = input.PushLimit(size); // Parse the message. if (!message->MergeFromCodedStream(&input)) return false; // Verify that the entire message was consumed. if (!input.ConsumedEntireMessage()) return false; // Release the limit. input.PopLimit(limit); return true; }</code>
这些实现确保 64MB 大小限制单独应用于每条消息,而不是整个流。此外,当消息大小相对较小时,他们利用优化来提高性能。
以上是如何在 C 语言中为 Protocol Buffer 实现定界 I/O 函数?的详细内容。更多信息请关注PHP中文网其他相关文章!