Java 中 Protocol Buffers 分隔 I/O 函数的 C 等效项
问题:
在C和Java中,如何使用长度读取Protocol Buffers消息并将其写入文件前缀? Java API 具有用于此目的的“定界”I/O 函数,但是 C 中是否有等效的函数?如果不是,大小前缀的底层传输格式是什么?
答案:
从版本 3.3.0 开始,C 现在包含等效函数google/protobuf/util/delimited_message_util.h. 这些函数提供了比之前建议的更快、更优化的实现
原始实现:
在引入官方等效项之前,可以使用以下优化的 C 实现:
bool writeDelimitedTo( const google::protobuf::MessageLite& message, google::protobuf::io::ZeroCopyOutputStream* rawOutput) { // Use a new coded stream for each message (fast). google::protobuf::io::CodedOutputStream output(rawOutput); // Write the size. const int size = message.ByteSize(); output.WriteVarint32(size); uint8_t* buffer = output.GetDirectBufferForNBytesAndAdvance(size); if (buffer != NULL) { // Optimization: Direct-to-array serialization for messages in a single buffer. message.SerializeWithCachedSizesToArray(buffer); } else { // Slower path for messages across multiple buffers. message.SerializeWithCachedSizes(&output); if (output.HadError()) return false; } return true; } bool readDelimitedFrom( google::protobuf::io::ZeroCopyInputStream* rawInput, google::protobuf::MessageLite* message) { // Each message uses its own coded stream (fast). google::protobuf::io::CodedInputStream input(rawInput); // 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; if (!input.ConsumedEntireMessage()) return false; // Release the limit. input.PopLimit(limit); return true; }
以上是如何在 C 和 Java 中读写带有长度前缀的 Protocol Buffer 消息?的详细内容。更多信息请关注PHP中文网其他相关文章!