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踩坑记录的主要内容,如果未能解决你的问题,请参考以下文章
何时Xcode中CoreData托管对象Optional和Default Value选项会变得尤为敏感?
何时Xcode中CoreData托管对象Optional和Default Value选项会变得尤为敏感?