Edw*_*don 31 uuid protocol-buffers
我想在我的protobuf用户消息示例中将UUID附加到字段.
message User {
// field containing id as UUID type
required string email;
optional string name;
}
Run Code Online (Sandbox Code Playgroud)
我知道protobuf消息还不支持UUID类型.我已经读过,最好的方法是使用UUID消息类型.
所以我猜我的用户消息将导入我的UUID消息原型定义并将其用作字段类型,如下所示:
import "myproject/UUID.proto";
message User {
required UUID id;
required string email;
optional string name;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,UUID消息将如何显示,以及如何对其进行编码/解码?我的目标是Java/Scala和C#兼容性.
Ken*_*rda 34
您应该使用string或bytes代表UUID.使用string如果它是最方便的,以保持在UUID人类可读的格式(例如"de305d54-75b4-431b-adb2-eb6b9e546014"),或使用bytes,如果你存储的128位值原料.(如果你不确定,你可能想要string.)
在所调用的消息类型中包装值UUID可能有助于使代码更加自我记录,但会产生一些性能开销,并不是严格要求的.如果要执行此操作,请定义类型:
message UUID {
required string value = 1;
}
Run Code Online (Sandbox Code Playgroud)
要么:
message UUID {
required bytes value = 1;
}
Run Code Online (Sandbox Code Playgroud)
JE4*_*E42 11
如果您想确保直接的互操作性,我建议使用字符串编码而不是字节编码:
message UUID {
required string value = 1;
}
Run Code Online (Sandbox Code Playgroud)
字节编码的问题是:不同的 UUID 库对字节使用不同的编码/解码方案,同时它们同意如何编码/解码字符串。
例如,请参阅 C#System.guid.toBytesArray返回混合字节序格式:前三个组件是小字节序编码,而后两个是大字节序编码。
在 Java 中,Apache Commons LibraryUuid.toRawBytes以大端编码返回 uuid:
"String": 35918bc9-196d-40ea-9779-889d79b753f0
"C#" : C9 8B 91 35 6D 19 EA 40 97 79 88 9D 79 B7 53 F0
"Java" : 35 91 8B C9 19 6D 40 EA 97 79 88 9D 79 B7 53 F0
Run Code Online (Sandbox Code Playgroud)
附带说明一下:Python 3Uuid提供了两种编码:bytes大端编码和bytes_le混合端编码。
我没有足够的声望点来发表评论,所以我必须写这个作为答案。
使用字符串,而不是与其他评论者所说的不同的字节数组。根据 MS ( https://docs.microsoft.com/en-us/dotnet/architecture/grpc-for-wcf-developers/protobuf-data-types ),“不要对 Guid 值使用字节字段。问题当 Protobuf 与其他平台(例如 Java)交互时,具有字节顺序(维基百科定义)的字节序可能会导致不稳定的行为。”
小智 6
如果有的话,您想使用它string来避免字节序问题。请注意,具有相同字符串表示形式(因此具有相同的“ id”)的UUID和MS GUID具有不同的字节流顺序(大端与小端)。如果您使用bytes该协议在使用UUID的Java和使用System.Guid的C#之间进行通信,则最终可能会获得翻转的ID。
| 归档时间: |
|
| 查看次数: |
15767 次 |
| 最近记录: |