In Protocol Buffers, it's often necessary to read or write multiple messages from a file or stream. To ensure proper handling of message boundaries, length prefixes can be added before each message. The Java API, starting from version 2.1.0, offers a set of "Delimited" I/O functions (parseDelimitedFrom, mergeDelimitedFrom, and writeDelimitedTo) to facilitate this process.
C Equivalents
As of Protobuf version 3.3.0, there are C equivalents for the delimited I/O functions found in the Java API. These functions can be found in the following header file:
google/protobuf/util/delimited_message_util.h
The functions are as follows:
bool writeDelimitedTo(const google::protobuf::MessageLite& message, google::protobuf::io::ZeroCopyOutputStream* rawOutput); bool readDelimitedFrom(google::protobuf::io::ZeroCopyInputStream* rawInput, google::protobuf::MessageLite* message);
Implementation
The following optimized implementations of the delimited I/O functions for C were provided by the author of the C and Java protobuf libraries. They address some issues found in alternative implementations:
bool writeDelimitedTo(const google::protobuf::MessageLite& message, google::protobuf::io::ZeroCopyOutputStream* rawOutput) { // ... } bool readDelimitedFrom(google::protobuf::io::ZeroCopyInputStream* rawInput, google::protobuf::MessageLite* message) { // ... }
These implementations include optimizations that minimize copies and avoid potential errors after processing large amounts of data. Also, unlike other implementations, these functions enforce a size limit on a per-message basis rather than on the entire stream.
The above is the detailed content of How to Achieve Delimited I/O Functionality in C Protocol Buffers?. For more information, please follow other related articles on the PHP Chinese website!