A l'aide de Google Protocol Buffers, puis-je définir une taille maximale pour tous les messages que je code? Si je sais que ce que je code n'est jamais plus grand que X octets, alors Protobuffs de Google produira toujours un tampon de taille Y, et si je lui donne une plus petite quantité de données, je le tamponnerai à la taille Y?Google Protocol Buffers - Tampon de taille fixe?
Répondre
Le format de fil pour les tampons de protocole ne rendrait pas ce trivial; Je ne suis pas conscient de de quelque chose pour le faire, mais une option serait de le sérialiser dans un tampon avec votre propre longueur en-tête et pad avec des données supplémentaires au besoin.
Vous devez ajouter un préfixe de longueur car il n'est pas ajouté par défaut, sinon il lirait la mémoire à la fin de votre tampon. Même les 0 à la traîne ne seraient pas légaux (ils chercheraient un numéro de champ).
Je ne peux pas commenter sur le C++ ou de Jon version C#, mais pour mon C# version (protobuf-net), vous devriez être en mesure de faire quelque chose comme (non testé):
using(var ms = new MemoryStream(fixedLength)) {
ms.SetLength(fixedLength);
Serializer.SerializeWithLengthPrefix(ms, obj);
if(ms.Length > fixedLength) { /* boom */ }
byte[] arr = ms.ToArray(); // use this
}
Cette devrait désérialiser correctement si également en utilisant DeserializeWithLengthPrefix
.
Re les questions (commentaires); SerializeWithLengthPrefix
est un protobuf-net -specific méthode; il peut être quelque chose dans la version C++, mais c'est assez simple. La façon de mettre en œuvre cette plus facile à partir de zéro est:
- suppose que nous allons laisser un en-tête de longueur fixe (4 octets) pour indiquer le volume de données réelles que nous avons
- sauter 4 octets (ou écrire 00- 00-00-00)
- maintenant serialize au reste du tampon
- trouver le nombre d'octets que vous venez d'écrire
- écrire cette valeur de retour au début du tampon
en sens inverse, évidemment:
- lire 4 octets et interpréter comme un entier
- deserialize que beaucoup de données
Il est un peu peu plus complexe protobuf- net, car il offre un peu plus d'options (comment l'int devrait être codé, et si oui ou non pour l'envelopper de sorte que le chose entière peut encore être traité comme un flux de protobuf 100% value - in particulier I suspect Je viens de décrire le comportement si j'ai demandé SerializeWithLengthPrefix
d'utiliser le codage à largeur fixe et "champ 0").
- 1. Delphi Protocol Buffers?
- 2. Thrift/Google Protocol Buffers sur Windows
- 3. Protocol Buffers Java RPC Stack
- 4. Un exemple avec Protocol Buffers + GWT?
- 5. Qt + Google Protocol Buffers, les bibliothèques reliant Trouble
- 6. Collections dans les messages Protocol Buffers?
- 7. Comment spécifier un tampon de taille fixe dans C++/CLI?
- 8. Pourquoi l'erreur "Impossible d'importer le nom descripteur_pb2" s'affiche-t-elle lors de l'utilisation de Google Protocol Buffers?
- 9. Est-ce que les buffers google supportent le calcul de la taille avant la sérialisation?
- 10. css, taille fixe
- 11. AES taille du tampon
- 12. std :: liste taille fixe
- 13. Protocole Buffers à classer?
- 14. Implémentation d'un fichier journal de taille fixe ou d'un tampon circulaire sur le disque
- 15. Buffers et octets?
- 16. Taille fixe à la liste
- 17. Taille de police fixe dans firefox?
- 18. Taille de la bordure d'une fenêtre fixe
- 19. CSS: taille fixe div, position verticale fixe et centré horizontalement?
- 20. Comment utiliser les tampons google protocol avec java me?
- 21. 960: aide avec la colonne de taille non fixe
- 22. Tomcat 6 Tampon par défaut Taille
- 23. Java HTTP Requests Taille du tampon
- 24. modifier la taille du tampon sur MediaPlayer
- 25. créer une vignette avec taille fixe codeignitor;
- 26. Taille du tampon du serveur UDT?
- 27. Blackberry VerticalFieldManager avec taille fixe: Défilement numéro
- 28. couple windows/buffers ensemble dans emacs?
- 29. EN Asp.net, fixe la taille du navigateur
- 30. Afficher l'image en div taille fixe
Merci beaucoup Marc, toujours utile. Pouvez-vous expliquer plus en détail ce que SerializeWithLengthPrefix fait réellement? Merci encore! – Roey
Encore une chose, je désérialise avec la version C++ de Protocol Buffers .... est-ce que DeserializeWithLengthPrefix existe sous une forme quelconque dans la version C++ ?? – Roey
@Roey - Je vais modifier cette information dans ... –