2016-03-31 16 views
11

私のprotobufユーザメッセージの例のフィールドにUUIDを添付します。protobufメッセージでUUIDを表すにはどうすればよいですか?

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

私はprotobufメッセージがまだUUIDタイプをサポートしていないことを知っています。私は最良の方法はUUIDメッセージタイプを持つことだと読んだことがあります。

だから、私は、ユーザーのメッセージは、私のUUIDメッセージプロト定義をインポートし、そのようなフィールドタイプとしてそれを使用します推測している:

import "myproject/UUID.proto"; 

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

私の質問はどのようにUUIDメッセージの外観が好きになるでしょうし、どのように、ありますそれをエンコード/デコードしますか? Java/ScalaとC#の互換性を目指しています。

答えて

13

おそらくstringまたはbytesを使用してUUIDを表す必要があります。人間が読める形式(例:"de305d54-75b4-431b-adb2-eb6b9e546014")でUUIDを使用するのが最も便利な場合は、stringを使用するか、128ビット値のrawを格納する場合はbytesを使用してください。

UUIDというメッセージタイプに値をラップすると、コードを自己文書化するのに役立ちますが、パフォーマンス上のオーバーヘッドがあり、厳密には必要ではありません(おそらく、stringが必要です)。 。

message UUID { 
    required string value = 1; 
} 

か:あなたはこれをしたい場合は、のようなタイプを定義

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

ありがとう、あなたは答えがはっきりしていて助けになりました。私は、メッセージを少しだけ少ない帯域幅で消費するように、バイトを使用する経路を試してみようと考えています。 UUIDは 'xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx'の形式を取っていますが、このフォームから128ビット生の値を最も効率的に取得する方法を知っていますか?または、私が正しい方向に向かうことができるオンラインリソースですか? –

+0

UUIDを文字列として格納することで、痛みを軽減することができます。 –

+0

@Hyperreal:FWIWを使用すると、ハイフンを削除して残りを16進文字列として解釈します。各2桁はバイトになります。しかし、ええ、おそらく文字列を格納する方が簡単です。 –

4

何でも、あなたはエンディアンの問題を回避するためにstringを使用したい場合。ただし、同じ文字列表現(したがって同じ "id")を持つUUIDとMS GUIDは、バイトストリームの順序が異なります(ビッグエンディアン対リトルエンディアン)。プロトコルでbytesを使用して、UUIDを使用してJavaとSystem.Guidを使用してC#間で通信すると、反転したIDで終わる可能性があります。

関連する問題