protobuf学习

来源:互联网 发布:php判断是否为素数 编辑:程序博客网 时间:2024/05/22 01:32

protobuf学习  

1.protobuf简介

全称“Protocol Buffers ”,是Google的一个开源项目。

protobuf其实和XML类似,是一种把数据按照某种特定的格式保存起来,用于存储,传输的规则。

2.protobuf的最大特点

(1)性能好,效率高

(2)代码生成机制

示例:

比如有个电子商务的系统(假设用C++实现),其中的模块A需要发送大量的订单信息给模块B,通讯的方式使用socket。

假设订单包括如下属性:

--------------------------------

  时间:time(用整数表示)

  客户id:userid(用整数表示)

  交易金额:price(用浮点数表示)

  交易的描述:desc(用字符串表示)

--------------------------------

  如果使用protobuf实现,首先要写一个proto文件(不妨叫Order.proto),在该文件中添加一个名为"Order"的message结构,用来描述通讯协议中的结构化数据。该文件的内容大致如下:

 

--------------------------------

message Order

{

  required int32 time = 1;

  required int32 userid = 2;

  required float price = 3;

  optional string desc = 4;

}

--------------------------------

使用protobuf内置的编译器编译 该proto。由于本例子的模块是C++,你可以通过protobuf编译器的命令行参数(看“这里 ”),让它生成C++语言的“订单包装类”。(一般来说,一个message结构会生成一个包装类)

  然后使用类似下面的代码来序列化/解析该订单包装类:

 

--------------------------------

// 发送方

Order order;

order.set_time(XXXX);

order.set_userid(123);

order.set_price(100.0f);

order.set_desc("a test order");

string sOrder;

order.SerailzeToString(&sOrder);

// 然后调用某种socket的通讯库把序列化之后的字符串发送出去

// ......

--------------------------------

// 接收方

string sOrder;

// 先通过网络通讯库接收到数据,存放到某字符串sOrder

// ......

Order order;

if(order.ParseFromString(sOrder)) // 解析该字符串

{

  cout <<"userid:" << order.userid() << endl

          <<"desc:" << order.desc() << endl;

}

else

{

  cerr << "parseerror!" << endl;

}

--------------------------------

(3)支持“向后兼容”和“向前兼容”

(4)支持多种编程语言(官方:c++,Python,Java)

3.核心概念

(1).proto文件

相当于确定数据协议,数据结构中存在哪些数据,数据类型是怎么样

(2)modifiers

required 不可以增加或删除的字段,必须初始化

optional 可选字段,可删除,可以不初始化

repeated 可重复字段,对应到java文件里,生成的是List

(3)Message

在proto文件里,数据的协议时以Message的形式表现的。

(4)Build

生成具体的java类时,例如Person.java,同时会存在build方法。文档的意思是对于转化后的数据,具有唯一性,build提供了便利的方法来初始化这些数据。

0 0
原创粉丝点击