【问题标题】:How to distinguish between multiple messages types in Cap'n Proto?如何区分 Cap'n Proto 中的多种消息类型?
【发布时间】:2017-11-20 22:31:47
【问题描述】:

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

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

如何在 Cap'n proto 中正确地做到这一点?

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

【问题讨论】:

    标签: websocket capnproto


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-13
      • 1970-01-01
      相关资源
      最近更新 更多