web-dev-qa-db-fra.com

Comment représenter un UUID dans un message protobuf?

Je veux attacher un UUID à un champ dans mon exemple de message d'utilisateur protobuf.

message User {
  // field containing id as UUID type
  required string email;
  optional string name;
}

Je sais que les messages protobuf ne prennent pas encore en charge le type UUID. J'ai lu que la meilleure approche est d'avoir un type de message UUID.

Je suppose donc que mon message d'utilisateur importerait ma définition de proto de message UUID et l'utiliserait comme un type de champ comme ceci:

import "myproject/UUID.proto";

message User {
  required UUID id;
  required string email;
  optional string name;
}

Ma question est de savoir à quoi ressemblera le message UUID et comment le coder/décoder? Je vise la compatibilité Java/Scala et C #.

28
Edward Maxedon

Vous devriez probablement utiliser string ou bytes pour représenter un UUID. Utilisez string s'il est plus pratique de conserver l'UUID dans un format lisible par l'homme (par exemple "de305d54-75b4-431b-adb2-eb6b9e546014") ou utilisez bytes si vous stockez la valeur 128 bits brute. (Si vous n'êtes pas sûr, vous voulez probablement string.)

L'encapsulation de la valeur dans un type de message appelé UUID peut être utile pour rendre le code plus auto-documenté, mais aura des frais généraux de performance et n'est pas strictement requis. Si vous voulez faire cela, définissez le type comme:

message UUID {
  required string value = 1;
}

ou:

message UUID {
  required bytes value = 1;
}
30
Kenton Varda

Si quelque chose, vous voulez utiliser string pour éviter les problèmes d'endianité. Notez qu'un UUID et un MS GUID qui ont la même représentation de chaîne (et sont donc le même "id") ont, cependant, un ordre de flux d'octets différent (big-endian vs little-endian Si vous utilisez bytes dans le protocole pour communiquer entre Java en utilisant UUID et C # en utilisant System.Guid, vous pourriez vous retrouver avec des ID inversés.).

5
Thales Carvalho