我有一个结构,我将其放入我的thrift接口,以便客户端将各种元数据传递给服务器(版本信息,客户端标识符,通常在HTTP头中的内容)。
我希望这始终是每个服务方法的 last 参数。我的想法是我可以定义这样的方法:
void Foo(1: i32 argA, 2: string argB, 10: myStruct trackingData)
这样,如果我添加另一个字段,我仍然可以在中间添加它:
void Foo(1: i32 argA, 2: string argB, 3: i32 somethingNew, 10: myStruct trackingData)
即使我们需要在中间添加新参数,这种情况是否会导致客户端出现向后或向前兼容性问题?
答案 0 :(得分:3)
是的,完全可以。
最佳实践:如果您在某个时间点发现您可能不再需要特定(非必需)字段,请仅在IDL文件中将其注释掉,不要删除它。这样很明显,这个数字已被使用过一次,不应该再次使用,否则会有兼容性问题。
答案 1 :(得分:0)
没关系,就像JensG回答的那样。
对于真正关心邮件大小的开发人员来说,来自协议缓冲区,知道在Thrift中没有一般规则,例如protobuf tags with values in the range 1 through 15 take one byte to encode [..] Tags in the range 16 through 2047 take two bytes.
。
这是因为Thrift提供了一系列编码(JSON,二进制,二进制紧凑,...),具体取决于编码索引的字节大小可能会或可能不会变化。例如,在JSON中,10到99之间的数字比0到9之间的数字多占一个字节。但是,在标准二进制编码中,所有索引的编码大小都相同。对于紧凑的二进制协议,如果您关心消息大小(在选择 compact 时可能会这样做),则使用较低的索引号也是有意义的。