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提供了便利的方法来初始化这些数据。
- protobuf学习
- protobuf 学习
- protobuf学习
- Protobuf学习
- Protobuf学习
- Protobuf学习
- google protobuf 学习
- google protobuf学习
- protobuf学习笔记
- protobuf-net学习笔记
- Protobuf学习笔记
- ProtoBuf学习笔记
- protobuf学习笔记
- protobuf-c学习笔记
- google protobuf 编程学习
- protobuf-c学习总结
- Protobuf学习(1)
- protobuf-c学习小结
- TextView的跑马灯效果以及TextView的一些属性
- BMT硬件之放大器(一):运算放大器的一些注意点
- $ORACLE_HOME/bin下的utilities解释
- 搭建免费网络直播系统
- 插入排序
- protobuf学习
- 阿里数据库监控druid配置
- ModelAndView返回json类型数据
- NYOJ3533D dungeon
- unity 计算两点的的角度
- VAD算法
- 图的重要性质
- codeforces 710f String Set Queries ac自动机 二进制分组
- JAVA List 移除元素