Java 协议缓冲区分隔 I/O 函数的 C 等效项
在 C 和 Java 中,都需要读写多个协议缓冲来自文件的消息。 Java 版本 2.1.0 为此提供了一组“分隔”I/O 函数:
这些函数有助于在每条消息之前附加长度前缀。然而,目前尚不清楚 C 中是否存在这样的功能。
C 等效项的存在
最初,这些 Java 函数没有直接的 C 等效项。然而,从版本 3.3.0 开始,C 现在在 google/protobuf/util/delimited_message_util.h 中提供了分隔消息实用函数。
大小前缀格式
For如果用户希望在这些官方实用程序发布之前用 C 语言实现自己的解析器,那么了解 Java API 附加的大小前缀的传输格式非常重要。该格式遵循以下准则:
优化的 C 实现
官方 C 实用函数发布后,发现了最初提出的实现中缺少的一些优化。下面提供的这些优化函数可提高性能并避免潜在错误:
<code class="cpp">bool writeDelimitedTo( const google::protobuf::MessageLite& message, google::protobuf::io::ZeroCopyOutputStream* rawOutput) { // Create a new coded stream for each message. google::protobuf::io::CodedOutputStream output(rawOutput); // Write the message size. const int size = message.ByteSize(); output.WriteVarint32(size); // Serialize the message directly to the output buffer if possible. uint8_t* buffer = output.GetDirectBufferForNBytesAndAdvance(size); if (buffer != NULL) { message.SerializeWithCachedSizesToArray(buffer); } else { // Use a slower path if the message spans multiple buffers. message.SerializeWithCachedSizes(&output); if (output.HadError()) return false; } return true; } bool readDelimitedFrom( google::protobuf::io::ZeroCopyInputStream* rawInput, google::protobuf::MessageLite* message) { // Create a new coded stream for each message. google::protobuf::io::CodedInputStream input(rawInput); // Read the message size. uint32_t size; if (!input.ReadVarint32(&size)) return false; // Set a read limit to enforce the 64 MB per-message size constraint. google::protobuf::io::CodedInputStream::Limit limit = input.PushLimit(size); // Parse the message. if (!message->MergeFromCodedStream(&input)) return false; if (!input.ConsumedEntireMessage()) return false; // Remove the read limit. input.PopLimit(limit); return true; }</code>
以上是如何使用定界 I/O 在 C 中编码和解码 Protocol Buffers 消息?的详细内容。更多信息请关注PHP中文网其他相关文章!