>Java >java지도 시간 >프로토콜 버퍼에 대해 C에서 구분된 I/O 기능을 구현하는 방법은 무엇입니까?

프로토콜 버퍼에 대해 C에서 구분된 I/O 기능을 구현하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-29 13:16:02302검색

How to Implement Delimited I/O Functions in C   for Protocol Buffers?

Java의 프로토콜 버퍼 구분 I/O 함수에 대한 C 등가물

C에는 "구분된" I에 대한 직접적인 등가물이 없습니다. /O 기능은 Java의 프로토콜 버퍼 API 버전 2.1.0에 도입되었습니다. 이러한 함수를 사용하면 길이 접두사가 첨부된 여러 프로토콜 버퍼 메시지를 읽고 쓸 수 있습니다.

Java 구분 I/O 함수의 와이어 형식

Java "구분된" I/ O 함수는 Google에서 문서화하지 않은 연결 형식을 사용합니다. 그러나 C 및 Java protobuf 라이브러리의 작성자는 유사한 기능의 비공식 구현을 제공했습니다.

<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>

이러한 구현은 64MB 크기 제한이 전체 스트림이 아닌 각 메시지에 개별적으로 적용되도록 보장합니다. 또한 메시지 크기가 상대적으로 작을 때 최적화를 활용하여 성능을 향상시킵니다.

위 내용은 프로토콜 버퍼에 대해 C에서 구분된 I/O 기능을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.