如何区分 Cap'n Proto 中的多种消息类型?

How to distinguish between multiple messages types in Cap'n Proto?

我正在使用 Cap'n proto 在多个客户端和我的 websocket 服务器之间发送和检索消息。

由于我只有一个 websocket 通道来发送和接收数据,并且可以发送各种类型的消息,因此在尝试解码时我需要一种方法来区分它们。

如何在 Cap'n proto 中正确完成此操作?

我认为这个问题与语言无关,但如果需要一种语言,我的服务器使用 Rust,客户端使用 Rust、Go 和 Javascript,因此适用于所有这些语言的解决方案将是非常感谢。

最好的办法是创建一个外部结构,它是所有可能类型的联合。例如,如果您有类型 FooBarBaz,请定义如下类型:

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

如何访问联合取决于语言,但通常有一个which()方法,returns一个枚举值指定填充哪个字段,然后你使用常规getter 嵌套结构的方法。

注意两端都要使用这种Outer类型。您不能序列化根类型为 Foo 的消息,然后将其解析为 Outer——必须使用类型 Outer 创建消息。一般来说,单靠字节是无法区分不同Cap'n Proto类型的。