Comment tampon protocole de poignée de contrôle de version?
Comment tampons de protocole, de gérer le type de versioning?
Par exemple, quand j'ai besoin de modifier une définition de type fil du temps? Comme l'ajout et la suppression de champs.
Vous devez vous connecter pour publier un commentaire.
Google conçu protobuf être assez indulgent avec gestion des versions:
cependant:
Généralement parlant, si - il travail juste, et vous n'avez pas besoin de vous soucier de la gestion des versions.
Je sais que c'est une vieille question, mais je suis tombé sur cette récemment. La façon dont je me suis autour, c'est à l'aide de façades et de l'exécution des décisions en temps pour sérialiser. De cette façon, je peux railler/mise à niveau d'un champ dans un nouveau type, avec les anciens et les nouveaux messages de la manipulation gracieusement.
Je suis à l'aide de Marc Gravel de l'protobuf.net (v2.3.5), et de C#, mais la théorie de façades fonctionne pour n'importe quelle langue et Google originale de protobuf mise en œuvre.
Mon ancienne classe avait un Horodatage de DateTime dont je voulais changer pour inclure le "Genre" (un .NET anachronisme). L'ajout de ce qui signifiait qu'il sérialisé à 9 octets au lieu de 8, ce qui serait une rupture de sérialisation changer!
Fondamental de protobuf est de ne JAMAIS changer le proto id! Je voulais lire les anciens sérialisé binaires, ce qui signifiait "3" était là pour rester.
Donc,
J'ai renommé le vieux de la propriété et il privé (oui, il peut encore désérialiser par la réflexion de la magie), mais mon API ne s'affiche plus, il utilisable!
J'ai créé un nouveau Timestamp de la propriété, avec un nouveau proto id, et inclus DateTime.Genre
J'ai ajouté un "AfterDeserialization" méthode de mise à jour de nos nouvelles de temps, dans le cas de vieux messages
Maintenant, j'ai les anciens et les nouveaux messages de la sérialisation/désérialisation correctement, et mon Timestamp comprend maintenant DateTime.Genre! Rien de cassé.
Toutefois, cela ne signifie pas que les DEUX champs seront dans tous les nouveaux messages à l'avenir. La touche finale consiste à utiliser un temps d'exécution de la sérialisation décision d'exclure le vieux Timestamp (remarque cela ne fonctionnera pas si c'est à l'aide protobuf de l'attribut obligatoire!!!)
Et c'est tout. J'ai une belle unité de test qui fait de bout en bout, si quelqu'un en veut...
Je sais que ma méthode s'appuie sur l' .NET magie, mais je crois que le concept pourrait être traduite dans d'autres langues....