thrift编译器采取的编译方式顺序编译,也就是每次读取一行内容;
常见问题一:
结构体内使用的枚举定义在结构体之后;
struct People
{
1: string name;
2: PeopleSex sex;
3: i32 age;
}
enum PeopleSex
{
MAN = 1;
WOMAN = 2;
}
这种情况能够编译通过,但是在使用中会出现无法正确使用枚举的情况;
原因如下:
Thrift编译器在编译枚举时,会对枚举进行封装:
// 一般枚举
enum PeopleSex
{
MAN = 1,
WOMAN = 2
};
// Thrift编译生成的枚举
class PropleSex
{
public:
enum type
{
MAN = 1,
WOMAN = 2
};
};
在Thrift描述文件中,我们将枚举定义在结构体之后,所以在编译后生成的文件中,结构体内的字段是这样的:
PeopleSex sex;
而正确的情况是这样的:
PeopleSex::type sex;
也就是说:
在Thrift文件中,如果结构体和枚举之间存在依赖关系,则需要将被依赖项前置声明定义,否则无法正确使用;
常见问题二:
optional修饰字段在传输后没有数据,字段为空;
这种问题出现在第一次使用Thrift,且没有仔细看文档的开发人员中;
optional修饰符是Thrift实现版本兼容的手段之一;
如果字段被optional修饰,如果不使用__set_xx进行赋值,或者使用__isset.xx = true;
则不会进行序列化,接收端也就无法获得值