2016-03-31 32 views
11

Desidero collegare un UUID a un campo nel mio esempio di messaggio utente protobuf.Come si rappresenta un UUID in un messaggio protobuf?

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

So che i messaggi protobuf non supportano ancora il tipo UUID. Ho letto che l'approccio migliore è avere un tipo di messaggio UUID.

Così sto cercando di indovinare il mio messaggio per l'utente sarebbe importare il mio messaggio UUID definizione proto e usarlo come un tipo di campo in questo modo:

import "myproject/UUID.proto"; 

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

La mia domanda è, come sarà l'aspetto messaggio UUID come, e in che modo lo codifico/decodificherò? Sto puntando sulla compatibilità Java/Scala e C#.

risposta

13

Probabilmente si dovrebbe usare string o bytes per rappresentare un UUID. Utilizzare string se è più conveniente mantenere l'UUID in formato leggibile dall'uomo (ad esempio "de305d54-75b4-431b-adb2-eb6b9e546014") o utilizzare bytes se si memorizza il valore a 128 bit come grezzo. (Se non si è sicuri, probabilmente si desidera string.)

Avvolgere il valore in un tipo di messaggio chiamato UUID può essere utile per rendere il codice più auto-documentazione, ma avrà un certo overhead prestazioni e non è strettamente necessario . Se si vuole fare questo, definire il tipo come:

message UUID { 
    required string value = 1; 
} 

o:

message UUID { 
    required bytes value = 1; 
} 
+0

Grazie Kenton, la tua risposta è stata chiara e utile. Penso che proverò a percorrere la strada dell'uso dei byte in modo che il messaggio consumi solo un po 'meno larghezza di banda. L'UUID assume la forma di 'xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx', sapresti come ottenere il valore grezzo a 128 bit da questo modulo nel modo più efficiente possibile? O qualche risorsa online che possa farmi andare nella giusta direzione? –

+0

Nevermind, memorizzare l'UUID come una stringa rende le cose molto meno dolorose ... –

+0

@Hyperreal: FWIW, per convertire in byte rimuovere i trattini e quindi interpretare il resto come una stringa esadecimale - ogni due cifre diventa un byte . Ma sì, probabilmente memorizzare una stringa è più facile. –

4

Semmai, si desidera utilizzare string per evitare problemi con endianness. Si noti che un UUID e un GUID MS con la stessa rappresentazione di stringa (e quindi lo stesso "id") hanno, tuttavia, un diverso ordine di byte-stream (big-endian vs little-endian). Se si utilizza bytes nel protocollo per comunicare tra Java utilizzando UUID e C# utilizzando System.Guid, si potrebbe finire con gli ID capovolti.