最近作的项目涉及到 Protobuf,因此就顺便整理上来分享一下吧。java
一套序列化方案。也就是说,把定义好的数据转换为通过精心安排的二进制形式,或者反过来。相较于 XML 或 JSON 更省流量。python
很少说,你们能够谷歌一下这方面的资料。android
下面进入正题。git
好吧被进入了。github
基于 protobuf 的特色,咱们须要使用 protobuf 的编译器 protoc
将咱们的数据结构定义文件(*.proto)编译生成对应语言的操做类。数据结构
protobuf 编译器机制是,一个主命令 protoc
,下面各个不一样的语言(好比 Objective-C)经过插件来扩充。这就省去了为了增长一个语言的支持而从新编译编译器(绕口令)的麻烦。工具
官方版的 protobuf 自带了 Java、Python 和 C++ 的支持。而 Android 团队为了照顾移动平台的计算能力,还作了 Java micro 和 Java nano 两个精简运行时,尽可能减小使用一些不是必须的语言特性。不过,不管什么语言,它们生成的二进制格式都是同样的。测试
首先固然要检出源代码。为了获得 Java micro 和 Java nano 两个版本的运行时,咱们干脆直接用 Android 团队维护的分支好了。google
鉴于 android.googlesource.com 在国内的访问速度有点内啥,咱们就用 GitHub 上的同步镜像吧。spa
git clone https://github.com/android/platform_external_protobuf.git android-protobuf
这条命令会将代码检出到 android-protobuf/
目录下。Android 团队的源代码都是按照整个 Android 的发布版原本打 tag 的,因此如今 tag 最新只到 4.4.2。master 分支上最近修复了 OS X 10.9 下一个编译失败问题,因此大胆用 master 分支的代码吧。
下面开始编译。gcc、libtool、autoconf 这些编译工具要先装好。
cd android-protobuf ./autogen.sh # 刷出好多东西,最后 exit 0 表示成功 ./configure # 又刷出不少东西,留意没报错就好了 make # 编译过程那些 xx is deprecated 的 warning 能够不用管 sudo make install # 安装
编译安装完了,测试一下:
$ protoc -h Usage: protoc [OPTION] PROTO_FILES Parse PROTO_FILES and generate output based on the options given: ...bla bla bla... --cpp_out=OUT_DIR Generate C++ header and source. --java_out=OUT_DIR Generate Java source file. --javamicro_out=OUT_DIR Generate Java source file micro runtime. --javanano_out=OUT_DIR Generate Java source file nano runtime. --python_out=OUT_DIR Generate Python source file.
看到 Java micro 和 Java nano 都装好了。
Java(包括 micro 和 nano)版的运行时都须要一个文件,这个文件自己是经过 protoc
编译生成的。这一步常常会不当心漏掉。
进入 android-protobuf/
下的 java/
目录:
cd java protoc --java_out=src/main/java -I../src ../src/google/protobuf/descriptor.proto
上面的 android-protobuf/java/
目录就是 protobuf 的运行时。简单来讲,就是 protoc
生成的那堆 Java 类继承自的那些类。
首先,我讨厌 Eclipse,我讨厌 Android Studio。
动手吧:
点开 File / Project Structure...
选 Modules,点 + 号,Import Module
选择刚刚检出的 android-protobuf/
目录下的 java/
目录
Import module from external model,Maven
Next
三个可选的运行时版本,须要的话就选上吧。
Next,Next,Finish
回到 Project Structure / Modules,点右边下面的 + 号,Module Dependency...
选刚刚导入进工做区的 protobuf-java
模块,OK