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