C Equivalents for Protocol Buffers Delimited I/O Functions in Java
In C , there are no direct equivalents to the "Delimited" I/O functions introduced in Java's Protocol Buffers API version 2.1.0. These functions allow for reading and writing multiple Protocol Buffers messages with length prefixes attached.
Wire Format of Java Delimited I/O Functions
The Java "Delimited" I/O functions use a wire format that is not documented by Google. However, the author of the C and Java protobuf libraries has provided unofficial implementations of similar functions:
<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>
These implementations ensure that the 64MB size limit is applied individually to each message and not to the entire stream. Additionally, they utilize optimizations to improve performance when the message size is relatively small.
The above is the detailed content of How to Implement Delimited I/O Functions in C for Protocol Buffers?. For more information, please follow other related articles on the PHP Chinese website!