Protobuf使用
Posted 依凡王子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Protobuf使用相关的知识,希望对你有一定的参考价值。
Protobuf使用(一)
前言:
最近由于接手一个支付的SDK项目,他们那边的网络请求和数据解析都与我平常接触的项目不同,数据请求由于保密暂时不能说,但是数据解析用的是Protobuf,于是我就顺便看了下Protobuf一些安装、使用的一些的方法,有一些简单的使用新的经验总结,希望能够帮助到大家,不多说,上正文:
Protobuf是什么:
本文简单介绍一下Protobuf是什么,它的优缺点,还有如何通过命令生成一个java文件,本次主要是介绍版本2.6.1,Proto2,它还有Proto3,以后的系列慢慢介绍。
Protocol Buffers是一个跨语言、跨平台的具有可扩展机制的序列化数据工具。也就是说,我在ubuntu下用python语言序列化一个对象,并使用http协议传输到使用java语言的android客户端,java使用对用的代码工具进行反序列化,也可以得到对应的对象。听起来好像跟json没有多大区别。。。其实区别挺多的。
Google说protobuf是smaller,faster,simpler,我们使用google规定的proto协议定义语言,之后使用proto的工具对代码进行“编译”,生成对应的各个平台的源代码,我们可以使用这些源代码进行工作。
比如说程序中生成了一个链表,但是程序退出重启后,还要重新生成链表,有时候,我们很需要上次程序中该链表中记录的数据。这些数据或许是经过很多大量运算生成的,每次都重新生成这些数据的话,需要消耗大量时间。这时候就可以考虑使用protobuf,将其序列化后保存在文件中,下次使用的时候,加载文件,反序列化后就可以直接使用了。
值得注意的是,protobuf是以二进制来存储数据的。相对于JSON和XML具有以下优点:
1,简洁
2,体积小:消息大小只需要XML的1/10 ~ 1/3
3,速度快:解析速度比XML快20 ~ 100倍
4,使用Protobuf的编译器,可以生成更容易在编程中使用的数据访问代码
5,更好的兼容性,Protobuf设计的一个原则就是要能够很好的支持向下或向上兼容
Mac环境集成Protobuf:
1. 下载protobuf2.6.1:https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz
2. 解压下载的文件
3. cd到protobuf-2.6.1目录
4. $./configure
5. $make
6. $make check
7. $sudo make install (需要接着输入密码)
8. $which protoc
9. $protoc --version
PS:(这是集成他的以前的旧版本,最新版本已经更新到3.5.1了,后续博客会接着介绍新版本的使用)
-------------------安装完毕-------------------
Protobuf 语法格式(Proto2):
我们需要定义一个.proto格式的文件,里面写的才是Protobuf格式的代码,我们先来看看Protobuf支持的数据类型:
目前Protobuf支持的数据类型和c++和java对应如下:
我们的.proto的文件示例如下:
syntax = "proto2";
package xiaomi.gamecenter.milink.msg;
option java_package = "org.xiaomi.gamecenter.milink.msg";
option java_outer_classname = "CreateOrderReq";
message OrderReq {
required string uid = 1;
optional int32 amount = 2;
optional int32 resultCode = 3;
}
OrderReq就是消息的名字,该消息有3个字段,在消息中承载的数据分别对应于每一个字段。其中每个字段都有一个修饰符,一种类型,一个名字和一个编号。
所指定的字段类型修饰符必须是如下之一:
required:一个格式良好的消息一定要含有1个这种字段。表示该值是必须要设置的;
optional:消息格式中该字段可以有0个或1个值(不超过1个),也就是可有可无;
repeated:在一个格式良好的消息中,这种字段可以重复任意多次(包括0次)。重复的值的顺序会被保留。表示该值可以重复,相当于java中的List。
注意:第一行必须 (syntax = "proto2";)标识语法格式的版本,之后是包名,java_outer_classname 标识生成的java文件的名称,并且其不能与.proto文件的名称相同,也不能与“message OrderReq”中的“OrderReq”名称相同,否则会报名称错误;
Protobuf 命令生成java文件:
protoc --plugin=/usr/local/bin/protoc-gen-objc ./CreateOrderReq.proto --java_out="/Users/zhengjunfei/miui/oauth/sdk_oauth/Plugin/src/"
其中红色字体表示的是.proto文件的路径,绿色字体标明的是输出的java格式文件的路径。其中蓝色的标识的是输出的文件格式,cpp_out、java_out、python_out命令分别可以生成C++、Java、Python代码。
完结:
后续会介绍protobuf的最新版本的使用包括在Android studio中的集成,希望大家能够后续持续关注,并且希望能够给大家提供到帮助,谢谢!
如要转载,请注明出处,谢谢!
欢迎关注我的博客园博客,地址是:
https://www.cnblogs.com/zhengjunfei/
同时欢迎大家关注我的简书博客,地址是:
https://www.jianshu.com/u/da06e00edefa
欢迎大家扫描关注我的微信公众号,我会定期发布一些博客,分享一些知识点
本文参考资料:
以上是关于Protobuf使用的主要内容,如果未能解决你的问题,请参考以下文章