13
ProtoBuf ProtoBuf ProtoBuf ProtoBuf Dongdong Deng <[email protected]>

Protobuf

Embed Size (px)

Citation preview

Page 1: Protobuf

ProtoBufProtoBufProtoBufProtoBuf

Dongdong Deng <[email protected]>

Page 2: Protobuf

OverView

� 1、简介

� 2、示例

� 3、.proto语法

Page 3: Protobuf

1111、ProtoBufProtoBufProtoBufProtoBufGoogle开源的,用于序列结构化数据的协议

http://code.google.com/apis/protocolbuffers

� 跨编程语言

�跨系统平台� 可扩展

Page 4: Protobuf

1111、ProtoBuf vs XMLProtoBuf vs XMLProtoBuf vs XMLProtoBuf vs XML�简单

�比XML小3-10倍�比XML快20-100倍�避免歧义�自动产生数据操作类,让开发者更容易使

Page 5: Protobuf

1111、ProtoBuf ProtoBuf ProtoBuf ProtoBuf 缺点

�目前使用不够广泛ProtoBuf目前没有广泛使用,如果系统需要提供若干对外

的接口给第三方系统调用,XML目前是更好的选择

�二进制格式导致可读性差二进制格式进行编码,通信协议出现问题不好跟踪

�缺乏自描述如果不配合相应的proto文件,ProtoBuf基本是看不懂,在配置文件方面,XML还是很有优势的

Page 6: Protobuf

2222、ProtoBuf ProtoBuf ProtoBuf ProtoBuf 示例

1: Write .proto 文件

2:protoc --cpp_out --java_out --python_out

3: *.pb.h *.pb.cc

4: using above *.pb.h in your program

Page 7: Protobuf

2222、.proto.proto.proto.proto

message Test

{

required int32 id = 1;

required string pwd = 2;

optional string others = 3;

}

Page 8: Protobuf

2222、protocprotocprotocprotoc

protoc --cpp_out=./test test.proto

$ls ./testtest.pb.h test.pb.cc

Page 9: Protobuf

2222、progam-progam-progam-progam-产生方

产生方:

Test test;test.set_id(344300);test.set_pwd(123);test.set_others("othersothers");

string sTest;test.SerailzeToString(&sTest);

Page 10: Protobuf

2222、progam-progam-progam-progam-读取方

读取方:string sTest; //得到协议数据,存放到sTest

Test test;

if(test.ParseFromString(sTest))

{ cout << "ID:" << test.id() << endl

<< "PWD:" << test.pwd() << endl

<< "others:" << test.others() << endl;

} else {

cerr << "parse error!" << endl;

}

Page 11: Protobuf

3333、proto proto proto proto 语法

Page 12: Protobuf

package tutorial;package tutorial;package tutorial;package tutorial;

message Person {message Person {message Person {message Person { required string name = 1; required string name = 1; required string name = 1; required string name = 1; required int32 id = 2; // Unique ID number for this person. required int32 id = 2; // Unique ID number for this person. required int32 id = 2; // Unique ID number for this person. required int32 id = 2; // Unique ID number for this person. optional string email = 3; optional string email = 3; optional string email = 3; optional string email = 3;

enum PhoneType { enum PhoneType { enum PhoneType { enum PhoneType { MOBILE = 0; MOBILE = 0; MOBILE = 0; MOBILE = 0; HOME = 1; HOME = 1; HOME = 1; HOME = 1; WORK = 2; WORK = 2; WORK = 2; WORK = 2; } } } }

message PhoneNumber { message PhoneNumber { message PhoneNumber { message PhoneNumber { required string number = 1; required string number = 1; required string number = 1; required string number = 1; optional PhoneType type = 2 [default = HOME]; optional PhoneType type = 2 [default = HOME]; optional PhoneType type = 2 [default = HOME]; optional PhoneType type = 2 [default = HOME]; } } } }

repeated PhoneNumber phone = 4; repeated PhoneNumber phone = 4; repeated PhoneNumber phone = 4; repeated PhoneNumber phone = 4;}}}}

// Our address book file is just one of these.// Our address book file is just one of these.// Our address book file is just one of these.// Our address book file is just one of these.message AddressBook {message AddressBook {message AddressBook {message AddressBook { repeated Person person = 1; repeated Person person = 1; repeated Person person = 1; repeated Person person = 1;}}}}

Make Presentation much more fun

@WPS@WPS@WPS@WPS官方微博官方微博官方微博官方微博

@kingsoftwps@kingsoftwps@kingsoftwps@kingsoftwps

Page 13: Protobuf