프로토콜 버퍼의 구분된 I/O 함수: C와 동일
여러 프로토콜 버퍼 메시지를 두 파일 모두에서 읽거나 쓰는 시나리오에서 C 및 Java에서는 메시지에 길이 접두사를 첨부해야 합니다. Java API는 이 목적을 위해 전용 "구분된" I/O 기능을 제공하지만 C의 해당 기능은 쉽게 눈에 띄지 않을 수 있습니다.
최근 업데이트에 따르면 이러한 C 기능은 이제 google/protobuf/util에 있습니다. /delimited_message_util.h 버전 3.3.0의 일부입니다. 그러나 이번 업데이트 이전에는 이 요구 사항을 효율적으로 해결하는 대체 구현이 있었습니다.
C 및 Java protobuf 라이브러리의 전 작성자가 제공한 구현 중 하나에는 64MB 입력 후 잠재적 오류를 방지하는 최적화가 포함되어 있습니다. . 아래 설명된 대로 이러한 구현은 개별 메시지에 64MB 제한을 적용하여 전체 제한을 초과하지 않고 스트리밍이 원활하게 계속되도록 보장합니다.
C에 최적화된 구분 I/O 구현
<code class="cpp">bool writeDelimitedTo( const google::protobuf::MessageLite& message, google::protobuf::io::ZeroCopyOutputStream* rawOutput) { // Initialize a CodedOutputStream for each message. google::protobuf::io::CodedOutputStream output(rawOutput); // Determine the message size and write it as a Varint. int size = message.ByteSize(); output.WriteVarint32(size); // Optimize for messages fitting into a single buffer. 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) { // Initialize a CodedInputStream for each message. google::protobuf::io::CodedInputStream input(rawInput); // Read the message size. uint32_t size; if (!input.ReadVarint32(&size)) return false; // Restrict reading to the determined message size. google::protobuf::io::CodedInputStream::Limit limit = input.PushLimit(size); // Parse the message and verify it fits within the limit. if (!message->MergeFromCodedStream(&input)) return false; if (!input.ConsumedEntireMessage()) return false; // Lift the reading restriction. input.PopLimit(limit); return true; }</code>
이러한 최적화된 구현은 다양한 크기의 메시지를 효과적으로 처리하고 C의 구분 I/O에 대한 안정적인 솔루션을 제공합니다.
위 내용은 프로토콜 버퍼에 대해 C에서 구분 I/O를 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!