Protocol Buffer是谷歌很早之前开源推出的一款跨平台的支持多种编程语言的结构化(序列化)高效的数据交换格式。那我们平时最常用的基本上都是JSON和XML格式进行数据交换、传输、存储等。
但谷歌推出的这款Protocol Buffer新的序列化数据交换格式相比传统的JSON和XML效率更好,性能更好,速度更快,更优秀。每一种语言都提供了编译器和库文件。这让我们在性能优化上,可以从数据交换传输上下手进行优化了。
这是它目前支持的语言。基本上都涵盖了。目前最新版本是V3.5.1。
好了,话不多说,我们看下基本用法。以Android平台使用编译为例。
1、先去google的github上下载Protocol Buffer的编译器(java版本的)。
地址:https://github.com/google/protobuf/releases/
这个里面含有protobuf的编译器源码,和java版本的jar源码,如果需要我们都可以自己编译。如果不想编译的话,protobuf的编译器可以直接下载官方编译好的。如下图为windows下编译好的exe编译器:
这个protoc-3.5.1-win32.zip下载解压后如下图所示结构,其中的protoc.exe为windows版本的编译器。
如果java的jar包库不想自己编译的话,可以在Android Studio的build.gradle里自己引用。
compile 'com.google.protobuf:protobuf-java:3.5.1'那话说回来了,那这两个编译器和java版的jar包想自己编译怎么办呢?
这里先说编译java版的jar。
先安装maven,http://maven.apache.org/ ,下载合适的包即可。
然后将maven的bin目录地址添加到path环境变量里去。
然后CMD执行mvn -version测试是否安装成功,输出相关版本信息则maven安装正确。
同时将下载好的protoc-3.5.1-win32.zip下载解压后将bin目录添加到path环境变量中去。CMD输入protoc --version,正确输出说明配置正确。
然后将我们下载好的protobuf-java-3.5.1.zip解压到文件夹。将protoc.exe拷贝到解压后的源码src目录下。
然后CMD定位到源码的java目录,如下图路径。
然后运行命令:mvn package。就会在java/core/target下生成protobuf-java-3.5.1.jar文件包。
最后我们说下如何生成proto文件。
首先我们看下关键命令吧。protobuf有个examples目录,里面有相关的例子。
第一步就是编写.proto文件,然后执行命令,生成.java实体类文件。这样这个.java实体类文件就是我们在项目中可以使用的了。
以编译addressbook.proto例子为例。
CMD定位到addressbook.proto所在目录,然后输入命令:protoc --java_out=. addressbook.proto
注意那个.代表当前目录,和后面的addressbook.proto有个空格。
执行后会在examples\com\example\tutorial目录下生成AddressBookProtos.java。
对比下生成前后的proto文件和java文件。
// See README.txt for information and build instructions. // // Note: START and END tags are used in comments to define sections used in // tutorials. They are not part of the syntax for Protocol Buffers. // // To get an in-depth walkthrough of this file and the related examples, see: // https://developers.google.com/protocol-buffers/docs/tutorials // [START declaration] syntax = "proto3"; package tutorial; import "google/protobuf/timestamp.proto"; // [END declaration] // [START java_declaration] option java_package = "com.example.tutorial"; option java_outer_classname = "AddressBookProtos"; // [END java_declaration] // [START csharp_declaration] option csharp_namespace = "Google.Protobuf.Examples.AddressBook"; // [END csharp_declaration] // [START messages] message Person { string name = 1; int32 id = 2; // Unique ID number for this person. string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { string number = 1; PhoneType type = 2; } repeated PhoneNumber phones = 4; google.protobuf.Timestamp last_updated = 5; } // Our address book file is just one of these. message AddressBook { repeated Person people = 1; } // [END messages]java类文件有点多,暂时就不展示了,自己操作。
我之前写了一个PersonMsg.proto文件,大家参考下。
syntax = "proto2"; message Person { // ID(必需) required int32 id = 1; // 姓名(必需) required string name = 2; // email(可选) optional string email = 3; // 朋友(集合) repeated string friends = 4; }有点像java实体。
那么编译后的.java文件如何用呢,和之前java的实体类调用很类似。
public class MainActivity extends AppCompatActivity { private ArrayList<PersonMsg.Person> list = new ArrayList<PersonMsg.Person>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { PersonMsg.Person person = PersonMsg.Person.newBuilder().setId(1).setName("name1") .setEmail("abc@qq.com").addFriends("ABC1").addFriends("ABC2").addFriends("ABC3").addFriends("ABC4").addFriends("ABC5").build(); list.add(person); list.add(person); list.add(person); list.add(person); list.add(person); for (PersonMsg.Person per : list) { Log.i("info", per.toString()); } } }具体的看Demo。
附上Demo地址:http://download.csdn.net/download/jay100500/10218636