Как я могу представить UUID в сообщении protobuf?
Я хочу добавить UUID в поле в моем примере сообщения пользователя protobuf.
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 и С#.
Ответы
Ответ 1
Вероятно, вы должны использовать string
или bytes
для представления UUID. Используйте string
, если наиболее удобно хранить UUID в удобном для чтения формате (например, "de305d54-75b4-431b-adb2-eb6b9e546014"
) или использовать bytes
, если вы храните 128-битное значение raw. (Если вы не уверены, вы, вероятно, захотите string
.)
Обтекание значения в типе сообщения, называемом UUID
, может оказаться полезным для того, чтобы сделать код более самодокументированным, но будет иметь некоторые служебные накладные расходы и не является строго обязательным. Если вы хотите это сделать, определите тип типа:
message UUID {
required string value = 1;
}
или
message UUID {
required bytes value = 1;
}
Ответ 2
Во всяком случае, вы хотите использовать string
, чтобы избежать проблем с контентом. Обратите внимание, что UUID и MS GUID, которые имеют одно и то же строковое представление (и, следовательно, являются одним и тем же "id" ), имеют, однако, другой порядок байтового потока (big-endian vs little-endian). Если вы используете bytes
в протоколе для связи между Java с использованием UUID и С# с помощью System.Guid, вы можете в итоге перевернуть идентификаторы.