Как установить значение enum в google-protobufjs - PullRequest
0 голосов
/ 15 ноября 2018

Привет, прото файл выглядит следующим образом:

enum Type
{
    A = 0;
    B = 1;
    C = 2;
}

message Message
{
    User to = 1;
    User from = 2;
    Type type = 3;
}

Я использую protoc компилятор, чтобы преобразовать его в служебные классы JavaScript. Используя этот сгенерированный файл javascript, я настроил объект Message в своем приложении следующим образом:

const message = new Main.Message()
message.setTo(this.user1) // saved user
message.setFrom(this.user3) // saved user
message.setType(0) // trying to set type to A

const buffer = message.serializeBinary()
socket.send(buffer)

Проблема, с которой я сталкиваюсь, заключается в том, что поля сообщения to и from обновляются правильно, но type остается null! Я не могу найти решение для этого.

Это потому, что в Message прото, ожидаемый тип как Enum? Но это javascript не представляется возможным. Как установить ожидаемые значения enum при создании protobuf для отправки?

Примечание:

Я заметил, что эта проблема возникает, только когда я пытаюсь установить zero значение для типа Enum!

1 Ответ

0 голосов
/ 24 ноября 2018

Перечисления в протобуфере используют 0 как значение по умолчанию (иначе неизвестное);from Протокол Буферизирует документы на Enums :

каждое определение перечисления должно содержать константу, которая отображается в ноль в качестве первого элемента.Это потому, что:

  • Должно быть нулевое значение, чтобы мы могли использовать 0 в качестве числового значения по умолчанию.

  • Нулевое значениедолжен быть первым элементом для совместимости с семантикой proto2, где первое значение перечисления всегда является значением по умолчанию.

Подробнее о по умолчанию :

Когда сообщение анализируется, если закодированное сообщение не содержит определенного единственного элемента, соответствующему полю в проанализированном объекте присваивается значение по умолчанию для этого поля:

  • Для перечислений значением по умолчанию является первое определенное значение перечисления, которое должно быть 0.

Перечисления по умолчанию даже не отправляются по проводам.Вы можете проверить это, проверив buffer после сериализации сообщения с перечислением с нулевым значением.Поскольку значение по умолчанию неотличимо от неустановленного значения, то, как оно будет выглядеть после десериализации, действительно на стороне декодера.

Вы не можете ничего с этим поделать, если не определите какие-либо значимые значения как 0 вваши перечисления и использовать вместо этого одноразовые значения, такие как NONE или UNSPECIFIED:

enum Type
{
    NONE = 0;
    A = 1;
    B = 2;
    C = 3;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...