Примеры использования уникальных идентификаторов в Cap'n Proto

Документация Cap'n Proto содержит одно предложение в обоснование уникального идентификатора:

Идентификаторы существуют для обеспечения относительно короткого, но однозначного способа ссылки на тип или аннотацию из другого контекста.

Я не смог найти никаких примеров такого рода ссылок. Кто-нибудь может указать мне на них? Благодарю.

1 ответ

Решение

Одним из примеров может быть собственный протокол RPC Cap'n Proto. Приемник RPC может потенциально реализовать любой произвольный набор интерфейсов. Таким образом, вызывающая сторона указывает, какой метод он хочет вызвать, отправляя идентификатор типа интерфейса плюс номер метода. Увидеть Call.interfaceId в rpc.capnp ,

Все, что просматривает аннотации, также нуждается в использовании идентификаторов, поскольку аннотации в скомпилированной схеме идентифицируются только по их идентификатору. Поэтому код, который проверяет аннотации, должен быть сделан по идентификатору. См., Например, эту вспомогательную функцию и этот сайт вызова в собственном генераторе кода C++ Cap'n Proto, который должен учитывать аннотацию, устанавливающую пространство имен C++ для файла.

Учитывая все вышесказанное, в общем, вам следует опасаться использования идентификаторов типов. Использование идентификаторов типов в протоколе все равно что полагаться на dynamic_cast в C++ - это не всегда плохо, но намекает на плохой дизайн, который не так безопасен для типов, как мог бы быть. Например, если у вас есть сообщение, которое может содержать один из N различных типов, у вас может возникнуть желание определить его следующим образом:

# BAD DESIGN
struct MyApplicationMessage {
  typeId @0 :UInt64;
  value @1 :AnyStruct;
}

Обычно, что вы действительно хотите здесь, так это union который содержит точно набор типов, ожидаемых для этого сообщения. Если вы используете union, тогда идентификаторы типа не имеют значения (и вы экономите место на проводе, так как union тег составляет всего 2 байта, а не 8).

Другие вопросы по тегам