프로토콜 버퍼의 구분된 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 구현
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;
}
이러한 최적화된 구현은 다양한 크기의 메시지를 효과적으로 처리하고 C의 구분 I/O에 대한 안정적인 솔루션을 제공합니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3