Как я могу представить 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, вы можете в итоге перевернуть идентификаторы.