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 #.
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;
}
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.).