问题:
开发人员尝试读取和写入多个 Protocol Buffers 消息从 C 和 Java 中的文件中使用 Java 中可用的“定界”I/O 函数可能会遇到问题,但看起来并非如此可在 C 中访问。
解决方案:
从版本 3.3.0 开始,C 中的头文件 google/protobuf/util 中引入了用于读写分隔消息的等效函数/delimited_message_util.h。这些函数是:
注意:
由 C 和 Java protobuf 库的原作者提供的替代实现提供了优化不存在于官方库实现中。如下所示,此实现可以防止输入 64MB 后出现潜在故障,同时仍对单个消息强制实施 64MB 限制:
bool writeDelimitedTo( const google::protobuf::MessageLite& message, google::protobuf::io::ZeroCopyOutputStream* rawOutput) { // We create a new coded stream for each message. Don't worry, this is 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: The message fits in one buffer, so use the faster // direct-to-array serialization path. message.SerializeWithCachedSizesToArray(buffer); } else { // Slightly-slower path when the message is multiple buffers. message.SerializeWithCachedSizes(&output); if (output.HadError()) return false; } return true; } bool readDelimitedFrom( google::protobuf::io::ZeroCopyInputStream* rawInput, google::protobuf::MessageLite* message) { // We create a new coded stream for each message. Don't worry, this is fast, // and it makes sure the 64MB total size limit is imposed per-message rather // than on the whole stream. (See the CodedInputStream interface for more // info on this limit.) google::protobuf::io::CodedInputStream input(rawInput); // Read the size. uint32_t size; if (!input.ReadVarint32(&size)) return false; // Tell the stream not to read beyond that size. 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 Buffers 定界 I/O 功能?的详细内容。更多信息请关注PHP中文网其他相关文章!