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

时间:2017-11-20 22:31:47

标签: websocket capnproto

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

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

如何在Cap&n; proto中正确完成?

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

1 个答案:

答案 0 :(得分:1)

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

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

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

请注意,两端都必须使用此Outer类型。您无法序列化根类型为Foo的邮件,然后将其解析为Outer - 必须使用类型Outer创建邮件。一般来说,没有办法根据单独的字节来区分不同的Cap'n Proto类型。