Как отличить несколько типов сообщений в Cap'n Proto?

Я использую протокол Cap'n для отправки и получения сообщений между несколькими клиентами и моим сервером веб-сокетов.

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

Как это можно сделать правильно в Cap'n Proto?

Я думаю, что этот вопрос не зависит от языка, но если язык необходим, у меня есть мой сервер на Rust и клиенты на Rust, Go и Javascript, так что решение, которое работает на всех этих языках, будет высоко цениться.

1 ответ

Решение

Лучше всего создать внешнюю структуру, которая является объединением всех возможных типов. Например, если у вас есть типы Foo, Bar, а также Bazопределите тип как:

struct Outer {
  union {
    foo @0 :Foo;
    bar @1 :Bar;
    baz @2 :Baz;
  }
}

Как получить доступ к профсоюзу, зависит от языка, но обычно есть which() метод, который возвращает значение перечисления, указывающее, какое поле заполнено, а затем вы используете обычные методы получения для вложенной структуры.

Обратите внимание, что оба конца должны использовать это Outer тип. Вы не можете сериализовать сообщение с корневым типом Foo а затем разобрать его как Outer - сообщение должно быть создано с типом Outer, В общем, нет никакого способа различить разные типы Cap'n Proto, основываясь только на байтах.

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