Dois-je utiliser un binaire ou un fichier texte pour stocker protobuf messages?

StackOverflow https://stackoverflow.com/questions/1859267

  •  13-09-2019
  •  | 
  •  

Question

Utilisation de Google protobuf, je sauve mes données messaged sérialisé dans un fichier - dans chaque fichier il y a plusieurs messages. Nous avons tous les deux C ++ et Python versions du code, donc je dois utiliser les fonctions de protobuf qui sont disponibles dans les deux langues. Je l'ai expérimenté avec l'utilisation SerializeToArray et SerializeAsString et il semble être les conditions malheureuses suivantes:

  1. SerializeToArray: Comme suggéré dans une réponse, la meilleure façon d'utiliser est un préfixe à chaque message avec sa taille de données. Cela fonctionne très bien pour C ++, mais en Python, il ne semble pas que cela est possible - je me trompe

  2. ?
  3. SerializeAsString: Cela génère une chaîne équivalente sérialisé à son homologue binaire - que je peux enregistrer dans un fichier, mais qu'advient-il si l'un des personnages dans le résultat de sérialisation est \ n - comment trouver les fins de ligne, ou la fin des messages pour cette question?

Mise à jour:

S'il vous plaît permettez-moi de reformuler légèrement. Si je comprends bien, je ne peux pas écrire des données binaires en C ++ car alors notre application Python ne peut pas lire les données, car il ne peut analyser les messages sérialisés de chaîne. Dois-je alors utiliser à la place SerializeAsString dans les deux C ++ et Python? Si oui, est-il préférable de stocker la pratique de ces données dans un fichier texte plutôt que d'un fichier binaire? Mon sentiment profond est binaire, mais comme vous pouvez voir cela ne ressemble pas à une option.

Était-ce utile?

La solution

La meilleure pratique pour concaténer les messages de cette manière est de préfixer chaque message avec sa taille. De cette façon, vous lisez dans la taille (essayez un int ou quelque chose 32bit), alors lisez ce nombre d'octets dans un tampon et désérialiser. Lisez ensuite la taille suivante, etc., etc.

La même chose vaut pour l'écriture, vous écrivez d'abord la taille du message, le message lui-même.

en streaming plusieurs messages sur la documentation pour plus protobuf informations.

Autres conseils

Nous avons eu beaucoup de succès base64 codant pour les messages, et en utilisant un simple \ n pour séparer les messages. Cela ofcoirse dépendra beaucoup de votre utilisation - nous avons besoin de stocker les messages dans les fichiers « log ». Il a naturellement le codage en tête / décodage cela -. Mais cela n'a même pas été un problème à distance pour nous

L'avantage de garder ces messages sous forme de texte séparé de la ligne a jusqu'à présent été très précieux pour la maintenance et le débogage. Calculez le nombre de messages dans un fichier? wc -l. Trouver le message Nième - head ... | tail. Déterminez ce qui ne va pas avec un disque sur un système distant, vous devez accéder via 2 réseaux privés virtuels et une solution de citrix? Le copier-coller le message et l'envoyer au programmeur.

Protobuf est un format binaire, la lecture et l'écriture si doit être fait sous forme binaire, pas de texte. Si vous ne voulez pas le format binaire, vous devriez envisager d'utiliser autre chose que protobuf (il y a beaucoup de formats de données textuelles, telles que XML, JSON, CSV); juste en utilisant des abstractions de texte ne suffit pas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top