Thrift参数编号的目的是什么?

时间:2015-09-22 03:14:17

标签: thrift

每个参数(字段标识符)之前的数字的用途是什么?它为什么从5跳到16?

struct Tweet {
    1: required i32 userId;
    2: required string userName;
    3: required string text;
    4: optional Location loc;
    5: optional TweetType tweetType = TweetType.TWEET;
    16: optional string language = "english";
}

(来自http://diwakergupta.github.io/thrift-missing-guide/的片段)

我一直试图找到答案,并且在文档中找不到任何内容。

1 个答案:

答案 0 :(得分:7)

这就是所谓的字段ID ,一个32位整数。除了数据本身之外,这是唯一能够让对方正确识别数据所属字段的方法。

在早期,系统会自动在内部提供这些ID,从而导致不兼容:如果有人更改了字段的顺序,则在其他字段之间添加字段或删除字段。出于兼容性原因,您仍然可以省略数字并让系统自动分配负ID 1)

struct yeolde {
    i32 foo
    string bar
}

但现在你得到一个很好的警告:

$ thrift -gen csharp test.thrift
[WARNING:test.thrift:3] No field key specified for foo, resulting protocol may have conflicts or not be backwards compatible!
[WARNING:test.thrift:4] No field key specified for bar, resulting protocol may have conflicts or not be backwards compatible!
  

为什么它从5跳到16?

有人可能认为这是一个好主意。除了数字必须是正32位值> 0之外,没有那么多限制。

或者在此期间已经删除了某些字段。特别是对于后一种情况,建议对过时的字段进行注释,但将它们保留在IDL中以防止出现兼容性事故,因为有人为了新的目的“重复使用”已使用和过时的旧字段编号。

1)这就是为什么不允许使用负ID号的原因。