thrift 的required、optional探究

本文通过实验探讨thrift中required、optional的区别。实验显示,required字段无__isset属性,optional和默认字段有;创建对象时,optional和默认__isset初始为false,rpc传输后,默认字段__isset变为true,optional仍为false;未设置isset的optional字段值在传输后丢失。原因分析涉及thrift生成的源码分析。
摘要由CSDN通过智能技术生成

原因

经常使用thrift来编写rpc通信,但是对下面两个问题还是有些疑惑

  1. thrift 的required、optional和不写有什么区别
  2. optional不设置isset的话被传输后值?

实验

今天就自己编写代码测试了一下。如下:

定义book.thrift 如下:

   1: namespace cpp codelab                                                                                                     
   2:  
   3: struct Book {
   
   4:   1: i32 book_id
   5:   2: string name
   6:   3: optional string optional_attr,
   7:   4: optional string optional_default_val_attr = "optional_default_val_attr",
   8:   5: string default_attr,
   9:   8: string default_val_attr = "default_val_attr",
  10:   10: required string required_attr,
  11:   11: required string required_default_val_attr = "equired_default_val_attr",
  12: }

client代码如下:

   1: int main(int argc, char **argv) {
   
   2:   boost::shared_ptr<TSocket> socket(new TSocket("localhost", 9090));
   3:   boost::shared_ptr<TTransport> transport(new TFramedTransport(socket));
   4:   boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));
   5:  
   6:   HelloBookClient client(protocol);
   7:   transport->open();
   8:   Book book;
   9:   book.name = "hello thrift";
  10:   printf("book __isset.name: %d\n", book.__isset.name);
  11:   printf("book name: %s\n", book.name.c_str());
  12:   printf("book __isset.optional_attr: %d\n", book.__isset.optional_attr);
  13:   printf("book optional_attr: %s\n", book.optional_attr.c_str());
  14:   printf("book __isset.optional_default_val_attr: %d\n",
  15:         book.__isset.optional_default_val_attr);
  16:   printf("book optional_default_val_attr: %s\n",
  17:         book.optional_default_val_attr.c_str());
  18:   printf("book __isset.default_attr: %d\n", book.__isset.default_attr);
  19:   printf("book default_attr: %s\n", book.default_attr.c_str());
  20:   printf("book __isset.default_val_attr: %d\n",
  21:       book.__isset.default_val_attr);
  22: printf("book default_val_attr: %s\n", book.default_val_attr.c_str());
  23: // printf("book __isset.required_attr: %d\n",
  24: //      book.__isset.required_attr);
  25: printf("book required_attr: %s\n", book.required_attr.c_str());
  26: // printf("book __isset.required_default_val_attr: %d\n",
  27: //     book.__isset.required_default_val_attr);
  28: printf("book required_default_val_attr: %s\n",
  29:       book.required_default_val_attr.c_str());
  30:  
  31: client.ping(book);
  32: transport->close();
  33:  
  34: return 0;
  35:    

Server端代码:

   1: class HelloBookHandler : virtual public HelloBookIf {                                                                     
   2:  public:
   3:   HelloBookHandler() {
   
   4:     // Your initialization goes here
   5:   }
   6:  
   7:   void ping(const codelab::Book& book) {
   
   8:     // Your implementation goes here
   9:     printf("book __isset.name: %d\n", book.__isset.name);
  10:     printf("book name: %s\n", book.name.c_str());
  11:     printf("book __isset.optional_attr: %d\n", book.__isset.optional_attr);
  12:     printf("book optional_attr: %s\n", book.optional_attr.c_str());
  13:     printf("book __isset.optional_default_val_attr: %d\n",
  14:           book.__isset.optional_default_val_attr);
  15:     printf("book optional_default_val_attr: %s\n",
  16:           book.optional_default_val_attr.c_str());
  17:     printf("book __isset.default_attr: %d\n", book.__isset.default_attr);
  18:     printf("book default_attr: %s\n", book.default_attr.c_str());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值