1

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

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

这如何在 Cap'n proto 中正确完成?

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

4

1 回答 1

2

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

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

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

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

于 2017-11-21T00:45:15.933 回答