最近作的項目涉及到 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