Перейти к содержанию

Декларации сообщений

От меня

В книге автор часто приводит примеры сгенерированного по файлу .proto кода. Он, конечно, несёт иллюстративную ценность, но, кажется, что желающие могут сгенерировать его и посмотреть сами. Так что примеры сгенерированного кода я почти везде опущу.

Третья секция файла proto посвящена декларации сообщений. Сообщения - это, по сути, входные и выходные параметры, объёдинённые в общие сущности.
Синтаксис декларации сообщений поддерживает следующее:

  • Скалярные типы;
  • Коллекции;
  • Перечисления (Enum);
  • Вложенные типы;
  • Импорт типов;
  • Известные типы: Любой (Any), Значение (Value), Обёртка (Wrapper), Дата и Время;
  • Бинарные данные (Bytes);
  • “Один из” (One of);
  • Пустые сообщения;
  • Комментарии.

Также представленный синтаксис НЕ поддерживает следующее:

  • Наследование;
  • Валидацию сообщений. В отличие от версии 2, версия 3 предполагает, что верифицирование сообщений будет происходить в коде клиента и/или сервера;
  • Отсутствие сообщения как параметра функции; даже если вашей функции не нужны входные параметры или она ничего не возвращает, обязательно задать сообщение без параметров.

Наконец, все сообщения подчиняются следующему правилу: задаются при помощи ключевого слова message, а все свойства по умолчанию необязательны. Каждому свойству должен присваиваться уникальный номер позиции. Также нужно отметить, что сгенерированные для сообщения классы наследуются от интерфейса IMessage<T>.
Вот пример задания сообщения CountryReply с тремя свойствами:

message CountryReply {
    int32 Id = 1;
    string Name = 2;
    string Description = 3;
}

Скалярные типы

Коллекции

Перечисления (Enums)

Вложенные типы

Синтаксис Protocol Buffers поддерживает вложенные типы. В примере тип сообщения Continent определяется прямо внутри сообщения CountryReply.

message CountryReply {
    message Continent {
        string Name = 1;
    }

    int32 CountryId = 1;
    Continent continent = 2; //Капитализация у типа и имени поля должна отличаться
}

Импорт типов

Определения можно хранить в раздельных файлах, импортируя их в нужные файлы определений сервисов. Это позволяет добиться переиспользования кода.
В синтаксисе Protocol Buffers импорт задаётся при помощи ключевого слова import и указания пути к нужному файлу. Путь указывается относительно директории выполнения компиляции, выполняемой инструментом Protoc (Protocol Buffer Compiler). В примере мы импортируем определение сообщения Continent.

import "continent.proto";

message CountryReply {
    int32 CountryId = 1;
    Continent continent = 2;
}

Известные типы (Well-Known Types)

Байты

Один из (One of)

Пустые сообщения

Комментарии


Последнее обновление : 23 апреля 2023 г.
Дата создания : 6 апреля 2023 г.

Комментарии

Комментарии