thrift optional 和 default踩坑记录

Posted 技术饕餮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了thrift optional 和 default踩坑记录相关的知识,希望对你有一定的参考价值。

在之前的文章中已经分析过,对于required类型的字段,在序列化时候,一定需要赋值,否则校验失败无法序列化成功,具体可见。


对于optional和default字段没有赋值的时候,在使用isSet***方法判断字段是否有被赋值,结果还是有很大区别的,optional的结果会是false,default的结果会是true。

如下一个thrift idl的定义:

struct Metrics { 1: ...... ...... 24: optional int conv_orders_num}


在service端,不对conv_orders_num进行设值。

在gateway端当采用以下形式判断是否有设值的时候

boolean flag1 = sellerData.getMetrics().isSetConv_orders_num()

得到的结果,是false。

同样的用TBase item; item.isSet方法,得到对结果一样也是false。



但是,如果将前面对optional去掉,idl定义如下:

struct Metrics { 1: ...... ...... 24: int conv_orders_num}

跟上面一样的操作,那么得到的结果,却都是true!service端依然是没有对此字段赋值的。


更深层的原因,我个人猜测是在编码/解码过程中导致的区别,可以进一步追溯源码。


记录这个的原因是,我一直认为optional和default是一样的,没有想到还有这个细节上的差别,导致在自测阶段花费近半天的时间来找问题。


以上是关于thrift optional 和 default踩坑记录的主要内容,如果未能解决你的问题,请参考以下文章

thrift安装及python和c++版本调试

何时Xcode中CoreData托管对象Optional和Default Value选项会变得尤为敏感?

何时Xcode中CoreData托管对象Optional和Default Value选项会变得尤为敏感?

pytest default config.option

23. 客户默认选项(Default Customer Options)

change your default system opening option using Ubuntu