Maison > développement back-end > C++ > Comment lire et écrire des messages de tampon de protocole avec des préfixes de longueur en C et Java ?

Comment lire et écrire des messages de tampon de protocole avec des préfixes de longueur en C et Java ?

Patricia Arquette
Libérer: 2024-12-09 08:17:16
original
726 Les gens l'ont consulté

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

Équivalents C des fonctions d'E/S délimitées par tampons de protocole en Java

Question :

En C et Java, comment les messages Protocol Buffers peuvent-ils être lus et écrits dans des fichiers en utilisant des préfixes de longueur ? L'API Java dispose de fonctions d'E/S « délimitées » à cet effet, mais existe-t-il des fonctions équivalentes en C ? Sinon, quel est le format de fil sous-jacent pour les préfixes de taille ?

Réponse :

Depuis la version 3.3.0, C inclut désormais des fonctions équivalentes dans google/protobuf/util/delimited_message_util.h. Ces fonctions permettent une implémentation plus rapide et plus optimisée que suggérée précédemment approches.

Implémentation originale :

Avant l'introduction des équivalents officiels, l'implémentation C optimisée suivante était disponible :

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;
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal