原因
经常使用thrift来编写rpc通信,但是对下面两个问题还是有些疑惑
- thrift 的required、optional和不写有什么区别
- 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());