Thrift结构体描述文件编译常见问题(C++)

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;

则不会进行序列化,接收端也就无法获得值

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值