64 votes

augmenter la sérialisation vs tampons de protocole google?

Quelqu'un qui a de l'expérience avec ces bibliothèques a-t-il des commentaires sur celle qu'elle préfère? Y a-t-il eu des différences de performances ou des difficultés d'utilisation?

44voto

ndfred Points 1866

J'ai été en utilisant le Boost de la Sérialisation pour longtemps et juste creusé dans le protocole de tampons, et je pense qu'ils n'ont pas exactement le même but. BS (n'a pas vu venir) enregistre vos objets en C++ à un flux, alors que le PB est un format d'échange que vous lisez.

Le PB du modèle de données est plus simple: vous avez toutes sortes d'entiers et des flottants, chaînes de caractères, les tableaux, la structure de base et c'est assez bien. BS permet d'enregistrer directement l'ensemble de vos objets en une seule étape.

Cela signifie qu'avec BS-vous obtenir plus de données sur le fil, mais vous n'avez pas à reconstruire l'ensemble de vos objets de structure, tandis que le protocole de tampons est plus compact, mais il n'y a plus de travail à faire après la lecture de l'archive. Comme le nom le dit, l'un est pour les protocoles (indépendant de la langue, de l'espace efficace de transmission de données), l'autre est pour la sérialisation (no-brainer objets de la sauvegarde).

Donc, ce qui est plus important pour vous: la vitesse/l'efficacité de l'espace ou de code propre?

29voto

Magnus Österlind Points 595

J'ai joué un peu avec les deux systèmes, rien de grave, juste une simple hackish trucs, mais j'ai senti qu'il y a une vraie différence dans la façon dont vous êtes censé utiliser les bibliothèques.

Avec boost::serialization, vous écrivez vos propres structures/classes d'abord, puis ajouter les méthodes d'archivage, mais vous êtes toujours à gauche avec quelques jolies "slim" classes, qui peut être utilisé en tant que membres de données, hérité, que ce soit.

Avec des tampons de protocole, la quantité de code généré pour une simple structure est assez importante, et les structures et le code généré est plus conçu pour l'exploitation, et que vous utilisez des tampons de protocole' de la fonctionnalité de transport des données vers et à partir de votre propre structure interne.

26voto

bacar Points 2017

Il ya un couple de problèmes supplémentaires avec boost.la sérialisation que je vais ajouter au mélange. Mise en garde: je n'ai pas d'expérience directe avec les tampons de protocole au-delà de l'écrémage de la documentation.

Notez que, bien que je pense de boost, et coup de pouce.la sérialisation, c'est super ce qu'il fait, je suis venu à la conclusion que la valeur par défaut des formats d'archive, il est livré avec ne sont pas un bon choix pour un format de câble.

Il est important de faire la distinction entre les versions de votre classe (comme mentionné dans d'autres réponses, coup de pouce.la sérialisation a un certain appui pour le contrôle de version de données) et à la compatibilité entre les différentes versions de la bibliothèque de sérialisation.

Des versions plus récentes de boost.la sérialisation peut pas générer des archives que les versions plus anciennes peuvent désérialiser. (l'inverse n'est pas vrai: des versions plus récentes sont toujours prévu pour désérialiser des archives faite par les versions plus anciennes). Cela a conduit à des problèmes suivants:

  • Tant que notre client & server software créer des objets sérialisés que l'autre consomme, nous ne pouvons donc passer à un nouveau coup de pouce.la sérialisation si nous améliorer à la fois le client et le serveur au même rythme. (C'est tout un défi dans un environnement où vous n'avez pas le plein contrôle de vos clients).
  • Boost est livré comme une grande bibliothèque avec des parties communes, et à la fois le code de sérialisation et les autres parties de la bibliothèque boost (ex: shared_ptr) peut être utilisé dans le même fichier, je ne peut pas mettre toutes les pièces de boost car je ne peut pas mettre de pouce.la sérialisation. Je ne suis pas sûr si c'est possible/coffre-fort/sane de tenter de lier plusieurs versions de boost dans un seul exécutable, ou si nous avons le budget/énergie de refactoriser des morceaux qui ont besoin de rester sur une ancienne version de boost dans un exécutable séparé (DLL dans notre cas).
  • L'ancienne version de boost, nous sommes coincés sur ne prend pas en charge la dernière version du compilateur que nous utilisons, de sorte que nous sommes coincés sur une ancienne version du compilateur.

Google semble en fait publier le protocole de tampons format de câble, et Wikipédia décrit comme un avant-compatible, rétro-compatible (bien que je pense que Wikipédia est en se référant à des données de gestion des versions plutôt que le protocole de la mémoire tampon de la bibliothèque de gestion des versions). Tout cela n'est pas une garantie de contrats à terme de compatibilité, il semble être une meilleure indication pour moi.

En résumé, je préfère un bien connu, publié fil de format comme le protocole de tampons quand je n'ai pas la possibilité de mettre à niveau le client et le serveur au même rythme.

Note de bas de page: shameless plug pour une réponse similaire par moi.

16voto

Nick Points 7464

Boost De La Sérialisation

  • est une bibliothèque pour écrire des données dans un flux.
  • ne pas compresser les données.
  • ne prend pas en charge les données de gestion des versions automatiquement.
  • prend en charge des conteneurs STL.
  • propriétés de données écrites dépendent de flux choisi (par exemple endian, comprimé).

Protocol Buffers

  • génère du code de description de l'interface (prend en charge le C++, Python et Java par défaut. C, C# et d'autres par le 3e partie).
  • éventuellement compresse les données.
  • poignées de contrôle de version de données automatiquement.
  • poignées endian échange entre les plates-formes.
  • ne prend pas en charge les conteneurs STL.

Stimuler la sérialisation est une bibliothèque pour la conversion d'un objet dans un sérialisés flux de données. Tampons de protocole, de faire la même chose, mais aussi effectuer d'autres travaux pour vous (comme la gestion des versions et endian permutation). Stimuler la sérialisation est plus simple pour les "petites tâches simples". Protocol Buffers sont probablement mieux pour les "grandes infrastructures".

EDIT:24-11-10: Ajout de "automatiquement" de BS, la gestion des versions.

14voto

Tom Points 6907

Je n'ai aucune expérience avec boost la sérialisation, mais j'ai utilisé les tampons de protocole. J'aime protocol buffers beaucoup. Gardez les points suivants à l'esprit (je dis cela avec aucune connaissance de boost).

  • Protocol buffers sont très efficaces, donc je ne pas imaginer qu'un problème grave contre coup de pouce.
  • Tampons de protocole, de fournir une représentation intermédiaire qui fonctionne avec d'autres langages (Python et Java... et plus en travaux). Si vous savez que vous êtes seulement en utilisant C++, peut-être boost est mieux, mais la possibilité d'utiliser d'autres langues est agréable.
  • Protocol buffers sont plus comme des conteneurs de données... il n'est pas orienté objet, la nature, tels que l'héritage. Réfléchir à la structure de ce que vous voulez de sérialiser.
  • Protocol buffers sont flexible car vous pouvez ajouter des "facultatif". Cela signifie fondamentalement que vous pouvez modifier la structure de tampon protocole sans casser la compatibilité.

Espérons que cette aide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X