在Cap'n Proto中使用唯一ID的示例

时间:2018-08-07 13:03:25

标签: capnproto

Cap'n Proto documentation仅包含一句话,说明唯一ID背后的原理:

  

ID的存在是为了提供一种相对简短而明确的方式来引用另一个上下文中的类型或注释。

我找不到这种引用的任何示例。有人可以指出我吗?谢谢。

1 个答案:

答案 0 :(得分:1)

一个例子是Cap'n Proto自己的RPC协议。 RPC接收器可以潜在地实现任何任意接口集。因此,调用方通过发送接口的类型ID加上方法号来指定他们希望调用的方法。参见Call.interfaceId in rpc.capnp.

任何查看批注的人也往往需要使用ID,因为已编译模式中的批注仅由其ID标识。因此,检查批注的代码需要按ID进行。例如,请参见Cap'n Proto自己的C ++代码生成器中的this helper functionthis call site,这需要遵循为文件设置C ++命名空间的注释。

总而言之,您应该警惕使用类型ID。在协议中使用类型ID有点像在C ++中依赖dynamic_cast -并不总是很糟糕,但是这暗示着糟糕的设计并不像类型安全那样糟糕。例如,如果您的消息可能包含N种不同类型之一,那么您可能会想像这样定义消息:

# BAD DESIGN
struct MyApplicationMessage {
  typeId @0 :UInt64;
  value @1 :AnyStruct;
}

通常,您真正想要的是一个union,其中包含该消息的确切类型集。如果您使用union,则类型ID无关紧要(并且节省了线路空间,因为union标签只有2个字节而不是8个字节)。