C의 프로토콜 버퍼용 구분 I/O 함수
질문:
Java 프로토콜 버퍼용 API v2.1.0에는parseDelimitedFrom, mergeDelimitedFrom 및 writeDelimitedTo를 포함한 "구분된" I/O 함수 세트가 도입되었습니다. 이 함수에 C와 동등한 기능이 있습니까? 그렇지 않다면 C에서 메시지 크기 접두사를 어떻게 처리할 수 있습니까?
답변:
v3.3.0부터 Google은 C에 구분된 I/O 기능을 추가했습니다. google/protobuf/util/delimited_message_util.h의 라이브러리. 그러나 더 많은 최적화를 제공하고 잠재적인 위험을 해결하는 대체 구현이 있습니다.
<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 size. int size = message.ByteSize(); output.WriteVarint32(size); // Optimize for messages that fit in a single buffer. uint8_t* buffer = output.GetDirectBufferForNBytesAndAdvance(size); if (buffer != NULL) { message.SerializeWithCachedSizesToArray(buffer); return true; } // Slower path for messages that span multiple buffers. message.SerializeWithCachedSizes(&output); return !output.HadError(); } 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 size. uint32_t size; if (!input.ReadVarint32(&size)) return false; // Limit the stream to the message 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; }</code>
이러한 구현은 64MB를 초과하는 크기의 메시지를 적절하게 처리하는 동시에 개별 메시지에 64MB 제한을 적용합니다.
위 내용은 프로토콜 버퍼용 Java API v2.1.0에 도입된 'Delimited' I/O 함수(parseDelimitedFrom, mergeDelimitedFrom 및 writeDelimitedTo)에 해당하는 C 함수가 있습니까? 그렇지 않다면, ㅎ의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!