初識ProtoBuf

protoBuf是什么?我想能夠搜索到這篇文章的朋友應該都有所了解了,所以我在這里就簡單的說一下。

protobuf就是一個可以跨語言、跨平臺的數據交換的格式。

介紹就這么多,言簡意賅嘛。下面我們就現安裝一下protobuf。
我本人比較喜歡去官網下載,下載展示如何在官網下載。

  • 進入官網,之后點擊下載-跳轉到github對應的protobuf項目點擊releases進入源頁面下載你所需要的版本。
    此處我通過wget命令下載,我使用的服務器為Centos 7。
# 下載protobuf
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.6.1/protobuf-all-3.6.1.tar.gz

#解壓
tar -zxvf protobuf-all-3.6.1.tar.gz 
cd protobuf-all-3.6.1

#預編譯和安裝,以下過程相對比較慢
./configure --prefix=/home/gnss/software/protobuf
make
make check
make install

#驗證是否安裝成功
cd /home/gnss/software/protobuf/bin
./protoc --version

#出現下面結果說明你安裝成功了
libprotoc 3.6.1

安裝成功之后,配置profile文件,以便于命令的運行。

vim /etc/profile

#在添加類似配置
PROTOBUF_HOME=/home/gnss/software/protobuf
PATH=$PATH:$PROTOBUF_HOME/bin
export PROTOBUF_HOME PATH

到此處安裝與配置都已經結束,下面可以正式對protobuf學習了。


首先我們先看一個案例,案例如下(因為我使用的是protobuf 3.0之后的版本,語法與2.0不同,詳細信息建議去官網查看):

#protobuf文件的后綴為proto
vim person.proto

#添加以下信息,由于本人是java程序員,以下都是以java為標準的
syntax = "proto3";

option java_package = "com.mrzhang.study.protobufdemo.protos";
option java_outer_classname = "PersonProto";

message Person {
    string name = 1;
    int32 age = 2;
    bool sex = 3;
    int64 birthday = 4;
    string address = 5;
    repeated Car cars = 6;
    map<string, string> other = 7;
}

message Car {
    string name = 1;
    string color = 2;
}

說明

  • syntax = "proto3":聲明語法,不顯示聲明默認是2.0的語法。
  • option java_package = "com.mrzhang.study.protobufdemo.protos":聲明生成的java文件的包名,包名稱為:com.mrzhang.study.protobufdemo.protos。
  • option java_outer_classname = "PersonProto":聲明生成的java文件的名稱,名稱為PersonProto。
  • message Person{}:聲明一個內部類,這點對于java程序員應該比較好理解。整個文件可以理解為是一個名為PersonProto的Java類,而里面聲明的message相當于PersonProto的內部類。
  • string name = 1:聲明內部類的屬性,及屬性類型,屬性編號。
    對于屬性聲明,格式為:標注+類型+屬性名+屬性順序號+[默認值]
    標注:required、optional、repeated標注存在著3中,在3.0之前,標注是必須的,但在3.0之后required、optional是可以不寫的,如果填寫了,抱歉語法會告訴你“3.0了,還寫它干嘛,趕緊刪了”repeated這個標注,是為了聲明集合而存在的,但是轉換為java類之后你會發現,它是List接口的一個實現類。
    屬性名:對應java類中的字段名稱,可以使用下劃線命名,在java類中會轉換為駝峰命名的。
    [默認值]:此屬性適用于3.0之前,在3.0之后不需要設置了。
    屬性順序號在同一個message內部是全局唯一的,不能夠重復。
    類型:這個比較多,我就只舉例較為常用的幾個,若想查看其他參數建議去官網查看,具體類型對比如下:
.proto類型 Java 類型 備注
int32 int 使用可變長度編碼。 編碼負數的效率低 - 如果您的字段可能有負值,請改用sint32。
int64 long 使用可變長度編碼。 編碼負數的效率低 - 如果您的字段可能有負值,請改用sint64。
sint32 int 使用可變長編碼方式。有符號的整型值。編碼時比通常的int32高效。
sint64 long 使用可變長編碼方式。有符號的整型值。編碼時比通常的int64高效。
float float
double double
bool boolean
string String 一個字符串必須是UTF-8編碼或者7-bit ASCII編碼的文本。

舉例: required sint number = 1 [description = 666];
保存文件通過protoc執行生成相關java文件。

#運行以下命令
protoc --java_out=./ person.proto 

#執行成功之后會在當前目錄下看到,你在文件中設置的java_package的文件路徑,進入路徑查看文件
cd com/mrzhang/study/protobufdemo/protos
ll

#看到以下文件
-rw-r--r--. 1 root root 77379 11月 15 00:00 PersonProto.java

查看文件內容如下(文件內容太長此處我就只摘抄部分):

package com.mrzhang.study.protobufdemo.protos;

public final class PersonProto {
    public  static final class Person extends com.google.protobuf.GeneratedMessageV3 implements PersonOrBuilder {
        private static final long serialVersionUID = 0L;

        private Person(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
            super(builder);
        }
        private Person() {
            name_ = "";
            age_ = 0;
            sex_ = false;
            birthday_ = 0L;
            address_ = "";
            cars_ = java.util.Collections.emptyList();
        }

        private volatile java.lang.Object name_;
        private int age_ ;
        private boolean sex_;
        private long birthday_;
        private volatile java.lang.Object address_;
        private java.util.List<com.mrzhang.study.protobufdemo.protos.PersonProto.Car> cars_;
        private com.google.protobuf.MapField<java.lang.String, java.lang.String> other_;
}

初識protobuf就到這里,后續我將結合java代碼,展示protobuf的使用。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網絡請求組件 FMDB本地數據庫組件 SD...
    陽明AGI閱讀 16,003評論 3 119
  • 佛爺持續寫作147天 “ 3 · 15 ”維護消費者合法權益是我們的責任,增強風險意識是消費者的責任,為消費者提供...
    佛爺v閱讀 802評論 3 4
  • 忙忙碌碌的一天,一大早去送兒子學美術,中午11:30接回兒子,兒子今天畫的國畫牡丹,真漂亮,兒子的畫在下半年有進步...
    孫芳連閱讀 196評論 0 0
  • r矢徑 nabla算子
    89cc282590b3閱讀 843評論 0 0