protobuf

protobuf 是一個靈活的、高效的、自動化的用於對結構化數據進行序列化的協議,與 XML 相比,protobuf  序列化後的碼流更小、速度更快、操做更簡單。序列化後字節佔用空間比 XML 少3-10倍,序列化的時間效率比 XML 快20-100倍。你只須要將要被序列化的數據結構定義一次(使用 .proto 文件定義),即可以使用特別生成的源代碼(使用 protobuf 提供的生成工具)輕鬆的使用不一樣的數據流完成對這些結構數據的讀寫操做,即便你使用不一樣的語言(protobuf 的跨語言支持特性)。你甚至能夠更新你的數據結構的定義(更新 .proto 文件內容)而不會破壞依賴以前編譯出來的程序。java

1. 優勢
protobuf 優勢:python

  1. 性能好,效率高;
  2. 代碼生成機制,數據解析類自動生成;
  3. 支持先後兼容;
  4. 支持多語言(c++, java, go, 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++

  1. required,表示該域必定出現,必需要設值,通常不推薦使用;
  2. optional,表示該域是可選的,可能存在也可能不存在;
  3. repeated,表示該域是一個數組。


2.2 域類型
域類型用於修飾域的類型,域類型有 bool, bytes, int32, int64, uint32, uint64, float, double, string等。

2.3 域名
域名只是做爲域的一個參考,使域更有可讀性,protobuf 肯定域是根據字段編號。

2.4 字段編號
protobuf 是根據字段編號來肯定域的,域名只是一個參考,字段編號不可重複,能夠不連續,[19000 ~ 19999] 被 protobuf 保留。
 數組

3. 兼容
protobuf 有很好的兼容性,先後都兼容。數據結構

  1. 向前兼容。版本升級後,新版 protobuf 在解析舊版二進制文件時,會給不存在屬性添加默認值,如 int 默認是0,字符串默認是空字符串;
  2. 向後兼容。版本升級後,舊版 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

相關文章
相關標籤/搜索