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