前言
1. 什么是protobuf
Google Protocol Buffer( 簡稱 Protobuf) 是 Google 公司內部的混合語言數據標准,是一種輕便高效的結構化數據存儲格式,平台無關、語言無關、可擴展,可用於通訊協議和數據存儲等領域。
2.
- 平台無關,語言無關,可擴展;
- 提供了友好的動態庫,使用簡單;
- 解析速度快,比對應的XML快約20-100倍;
- 序列化數據非常簡潔、緊湊,與XML相比,其序列化之后的數據量約為1/3到1/10。
安裝
MAC/OS 安裝
1. 下載
https://github.com/google/protobuf/releases下載protobuf-all-3.5.1.tar.gz
2. 解壓 tar xvf protobuf-all-3.5.1.tar.gz
3. 編譯並安裝
cd protobuf.3.5.1 ./configure make make check make install
4. 驗證
protoc --version
一個簡單的例子
1. 創建 .proto 文件
syntax = "proto3"; package tutorial; option java_package = "com.example.tutorial"; option java_outer_classname = "AddressBookProtos"; message Person { string name = 1; int32 id = 2; string email = 3; } message AddressBook { repeated Person people = 1; int32 id = 2; }
2. 編譯
protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/addressbook.proto
使用上面的命令格式生成編譯很好的Java class文件
3. 創建Maven項目,添加pom依賴
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>protobuftest</groupId> <artifactId>protobuftest</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.5.1</version> </dependency> </dependencies> </project>
項目的結構如上圖所示。
4. 新建一個Test類來進行測試
package com.example.tutorial; import java.io.IOException; public class Test { public static void main(String[] args) throws IOException { AddressBookProtos.Person.Builder pbulider = AddressBookProtos.Person.newBuilder(); pbulider.setId(1); pbulider.setName("jinhong"); pbulider.setEmail("1060951934@qq.com"); AddressBookProtos.Person person = pbulider.build(); AddressBookProtos.AddressBook.Builder builder = AddressBookProtos.AddressBook.newBuilder(); builder.addPeople(person); builder.setId(1); AddressBookProtos.AddressBook addressBook = builder.build(); System.out.println("before :" + addressBook.toString()); System.out.println("addressBook byte"); for (byte b : addressBook.toByteArray()) { System.out.println(b); } System.out.println(addressBook.toByteString()); byte[] byteArray = addressBook.toByteArray(); AddressBookProtos.AddressBook person2 = AddressBookProtos.AddressBook.parseFrom(byteArray); System.out.println("after: " + person2.toString()); } }
測試的結果如下:
通過上面的測試,我們簡單了解了protobuf的使用。后續將繼續深入了解protobuf的一些細節。
在學習的時候建議多了解下IDL(interface discription language)的概念,它是跨語言和平台的關鍵。