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的使用。