我想在我的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#兼容性。
答案 0 :(得分:26)
您应该使用string
或bytes
来表示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之类的其他平台进行交互时,字节序(维基百科定义)的问题可能导致行为不稳定”。 >