如何在protobuf消息中表示UUID?

时间:2016-03-31 22:18:04

标签: protocol-buffers 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#兼容性。

3 个答案:

答案 0 :(得分:26)

您应该使用stringbytes来表示UUID。如果最方便的话是将UUID保持为人类可读的格式(例如string),或者如果要存储128位的原始值,请使用"de305d54-75b4-431b-adb2-eb6b9e546014",请使用bytes。 (如果你不确定,你可能想要string。)

将值包含在名为UUID的消息类型中可能有助于使代码更加自我记录,但会产生一些性能开销,并且不是严格要求的。如果要执行此操作,请定义类似的类型:

message UUID {
  required string value = 1;
}

或:

message UUID {
  required bytes value = 1;
}

答案 1 :(得分:4)

如果有的话,您希望使用string来避免字节序问题。请注意,具有相同字符串表示形式的UUID和MS GUID(因此具有相同的" id")具有不同的字节流顺序(big-endian vs little-endian)。如果在协议中使用bytes使用UUID在Java之间进行通信,使用System.Guid在C#之间进行通信,则最终可能会出现翻转的ID。

答案 2 :(得分:2)

我没有足够的声誉积分来发表评论,所以我必须写这个作为答案。

使用字符串,而不是字节数组,这与其他注释者所说的不同。根据MS({https://docs.microsoft.com/en-us/dotnet/architecture/grpc-for-wcf-developers/protobuf-data-types)的说法,“不要在Guid值中使用字节字段。当Protobuf与Java之类的其他平台进行交互时,字节序(维基百科定义)的问题可能导致行为不稳定”。 >