2016-03-31 19 views
11

Protobuf Kullanıcı mesaj örneğimde bir alana UUID eklemek istiyorum.Bir protobuf mesajında ​​bir UUID'yi nasıl temsil edebilirim?

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

Protobuf iletilerinin henüz UUID türünü desteklemediğini biliyorum. En iyi yaklaşımın UUID mesaj tipine sahip olduğunu okudum.

import "myproject/UUID.proto"; 

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

Sorum şu, nasıl olacak UUID mesajı bakmak gibi ve nasıl:

Yani benim UUID mesajı proto tanımını içe ve bir alan şöyle türü olarak kullanmak istiyorsunuz benim Kullanıcı mesaj tahmin ediyorum onu kodlayacak/çözecek miyim? Java/Scala ve C# uyumluluğunu hedefliyorum.

cevap

13

Bir UUID değerini göstermek için muhtemelen string veya bytes kullanmalısınız. UUID'yi insan tarafından okunabilir biçimde (örneğin "de305d54-75b4-431b-adb2-eb6b9e546014") tutmak veya 128 bitlik değeri işlenmemişse bytes kullanın, string kullanın. Kod daha fazla öz documenting yapmak yararlı olabilir UUID adlı bir ileti türü değeri tamamlayan

(Emin değilseniz, büyük olasılıkla. string istiyorum) ama bazı performans yükü olacak ve kesinlikle gerekli değildir .

message UUID { 
    required string value = 1; 
} 

ya: Bunu yapmak istiyorsanız, benzeri bir tür tanımlamak

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

Teşekkürler Kenton, cevabınız açık ve yardımseverdi. Sanırım bayt kullanmanın yolunu bulmaya çalışacağım ve mesaj sadece biraz daha az bant genişliği tüketecek. UUID 'xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx' şeklini alır, bu formdan 128 bitlik ham değeri en verimli şekilde nasıl alacağınızı bilir misiniz? Ya da bana doğru yönde gidebilecek herhangi bir çevrimiçi kaynak? –

+0

Nevermind, UUID'yi bir dize olarak saklamak işleri çok daha az ağrılı hale getiriyor ... –

+0

@Hyperreal: FWIW, baytlara dönüştürmek için tireleri çıkarır ve geri kalanını bir hex dizgesi olarak yorumlar - her iki basamak bir bayt olur . Ama evet, muhtemelen bir ipi saklamak daha kolay. –

4

şey, sen endian ile sorunları önlemek için string kullanmak istiyorsanız. Bununla birlikte, aynı dize gösterimine (ve dolayısıyla aynı "id") sahip olan bir UUID ve bir MS GUID'in, farklı bayt akış sırasına (büyük-endian'a karşı küçük-endian) sahip olduğuna dikkat edin. UUID ve C# kullanarak System.Guid kullanarak Java arasında iletişim kurmak için protokolde bytes kullanırsanız, ters çevrilmiş kimlikler ile sonuçlanabilir.

İlgili konular