我正在使用 Cap'n proto 在多个客户端和我的 websocket 服务器之间发送和检索消息。
由于我只有一个 websocket 通道来发送和接收数据并且可以发送各种类型的消息,因此在尝试解码时我需要一种区分 then 的方法。
这如何在 Cap'n proto 中正确完成?
我认为这个问题与语言无关,但如果需要一种语言,我的服务器使用 Rust,客户端使用 Rust、Go 和 Javascript,因此非常感谢能够在所有这些语言中工作的解决方案。
最好的办法是创建一个外部结构,它是所有可能类型的联合。例如,如果您有类型Foo
、Bar
和Baz
,请定义如下类型:
struct Outer {
union {
foo @0 :Foo;
bar @1 :Bar;
baz @2 :Baz;
}
}
如何访问联合取决于语言,但通常有一个which()
方法返回一个枚举值,指定填充哪个字段,然后您对嵌套结构使用常规 getter 方法。
注意两端都必须使用这种Outer
类型。您不能序列化具有根类型的消息,Foo
然后将其解析为Outer
- 消息必须使用 type 创建Outer
。一般来说,仅根据字节无法区分不同的 Cap'n Proto 类型。