Heim >Backend-Entwicklung >C++ >Wie lese und schreibe ich Protokollpuffernachrichten mit Längenpräfixen in C und Java?

Wie lese und schreibe ich Protokollpuffernachrichten mit Längenpräfixen in C und Java?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-09 08:17:16654Durchsuche

How to Read and Write Protocol Buffer Messages with Length Prefixes in C   and Java?

C-Äquivalente von durch Protokollpuffer getrennten E/A-Funktionen in Java

Frage:

Wie können Protokollpuffernachrichten in C und Java mithilfe von Längenpräfixen gelesen und in Dateien geschrieben werden? Die Java-API verfügt zu diesem Zweck über „getrennte“ E/A-Funktionen, aber gibt es entsprechende Funktionen in C? Wenn nicht, welches ist das zugrunde liegende Drahtformat für die Größenpräfixe?

Antwort:

Ab Version 3.3.0 enthält C nun entsprechende Funktionen in google/protobuf/util/delimited_message_util.h. Diese Funktionen bieten eine schnellere und optimiertere Implementierung als zuvor vorgeschlagen Ansätze.

Ursprüngliche Implementierung:

Vor der Einführung der offiziellen Äquivalente war die folgende optimierte C-Implementierung verfügbar:

bool writeDelimitedTo(
    const google::protobuf::MessageLite& message,
    google::protobuf::io::ZeroCopyOutputStream* rawOutput) {
  // Use a new coded stream for each message (fast).
  google::protobuf::io::CodedOutputStream output(rawOutput);

  // Write the size.
  const int size = message.ByteSize();
  output.WriteVarint32(size);

  uint8_t* buffer = output.GetDirectBufferForNBytesAndAdvance(size);
  if (buffer != NULL) {
    // Optimization: Direct-to-array serialization for messages in a single buffer.
    message.SerializeWithCachedSizesToArray(buffer);
  } else {
    // Slower path for messages across multiple buffers.
    message.SerializeWithCachedSizes(&output);
    if (output.HadError()) return false;
  }

  return true;
}

bool readDelimitedFrom(
    google::protobuf::io::ZeroCopyInputStream* rawInput,
    google::protobuf::MessageLite* message) {
  // Each message uses its own coded stream (fast).
  google::protobuf::io::CodedInputStream input(rawInput);

  // 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;
  if (!input.ConsumedEntireMessage()) return false;

  // Release the limit.
  input.PopLimit(limit);

  return true;
}

Das obige ist der detaillierte Inhalt vonWie lese und schreibe ich Protokollpuffernachrichten mit Längenpräfixen in C und Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn