protobuf 是一個靈活的、高效的、自動化的用於對結構化數據進行序列化的協議,與 XML 相比,protobuf 序列化後的碼流更小、速度更快、操做更簡單。序列化後字節佔用空間比 XML 少3-10倍,序列化的時間效率比 XML 快20-100倍。你只須要將要被序列化的數據結構定義一次(使用 .proto 文件定義),即可以使用特別生成的源代碼(使用 protobuf 提供的生成工具)輕鬆的使用不一樣的數據流完成對這些結構數據的讀寫操做,即便你使用不一樣的語言(protobuf 的跨語言支持特性)。你甚至能夠更新你的數據結構的定義(更新 .proto 文件內容)而不會破壞依賴以前編譯出來的程序。java
1. 優勢
protobuf 優勢:python
2. 數據結構
protobuf 使用 .proto 文件定義數據結構。
syntax = "proto3";
package protobuf;
option java_package = "com.aaron.protobuf";
message msg {
required int32 = 1;
optional string = 2;
repeated bytes = 3;
message address {
string city = 1;
}
repeated address = 4;
}
2.1 域修飾符
域修飾符用於表示域出現狀況。c++
2.2 域類型
域類型用於修飾域的類型,域類型有 bool, bytes, int32, int64, uint32, uint64, float, double, string等。
2.3 域名
域名只是做爲域的一個參考,使域更有可讀性,protobuf 肯定域是根據字段編號。
2.4 字段編號
protobuf 是根據字段編號來肯定域的,域名只是一個參考,字段編號不可重複,能夠不連續,[19000 ~ 19999] 被 protobuf 保留。
數組
3. 兼容
protobuf 有很好的兼容性,先後都兼容。數據結構
4. 使用
以 java 爲例,展現如何使用 protobuf。從 .proto 的定義中生成代碼,咱們經過 protobuf 的編譯器來完成。
4.1 添加 protobuf-java 依賴
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.0.0</version>
</dependency>
4.2 添加 protobuf 編譯插件
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.5.0</version>
<configuration>
<protocArtifact>com.google.protobuf:protoc:3.0.0-beta-2:exe:${os.detected.classifier}
</protocArtifact>
<protoSourceRoot>src/main/proto</protoSourceRoot>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
4.3 生成代碼
Maven -> Plugins 運行 prtobuf:compile 便可生成代碼maven