Как отличить несколько типов сообщений в 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, основываясь только на байтах.