Protobuf 結(jié)合 Java 快速入門

什么是 Protobuf弃衍?

  • Protobuf 是 Google 開發(fā)的一種數(shù)據(jù)交換的序列化協(xié)議肴焊,性能非常高唧瘾,大部分 IM 通訊協(xié)議都是使用它來傳輸,例如支付寶缨该、微信等 APP

安裝 Protobuf

Window 系統(tǒng)

  1. 下載需要的安裝包:https://github.com/google/protobuf/releases
    • protoc-3.6.0-win32.zip
    • protobuf-java-3.6.0.zip
  2. 將 protoc-3.6.0-win32.zip 中的 protoc.exe 拷貝到 c:\windows\system32 中
  3. 將 proto.exe 文件拷貝到解壓后的 protobuf-java-3.6.0\src 目錄中
  4. 在 protobuf-java-3.6.0\java 目錄下執(zhí)行 mvn package 命令(這一步相當(dāng)于安裝了)
  5. 執(zhí)行 protoc –-version 命令檢查是否安裝成功

MAC 系統(tǒng)

  • 對于 Mac 系統(tǒng)只需要使用 brew 安裝即可
brew install protobuf

Protobuf 描述文件

更詳細(xì)的描述文件編寫可以閱讀該篇文章:https://blog.csdn.net/u011518120/article/details/54604615#ScalarValueTypes

  • Protobuf 編譯器通過描述文件(.proto文件)生成對應(yīng)于語言的代碼偎行,代碼中定義了消息類型、獲取贰拿、設(shè)置蛤袒、編解碼序列化等操作。這也是為什么 Protobuf 支持跨語言傳輸膨更,因為消息所有端共用一個通用的描述文件

定義一個消息類型

  • 下面 .proto 文件定義了一個 "搜索請求" 消息格式
syntax = "proto3";  // 指定使用 proto3 語法

option java_package = "com.test";     // 指定包名
option java_outer_classname = "ProtoBufTest"; // 指定類名

message SearchRequest { 
  string query = 1;     // 指定字段類型為 string妙真,標(biāo)識號為 1
  int32 page_number = 2;
  int32 result_per_page = 3;
  enum Corpus {         // 枚舉類型
    UNIVERSAL = 0;      // 每個枚舉類型必須將其第一個類型映射為 0 作為默認(rèn)值
    WEB = 1;
    IMAGES = 2;
    LOCAL = 3;
    NEWS = 4;
    PRODUCTS = 5;
    VIDEO = 6;
  }
  Corpus corpus = 4;
  repeated Result results = 5;
}

message Result  {
    ...
}
  • 標(biāo)識號:每個字段都有唯一的數(shù)字標(biāo)識號,需要注意的是 [1,15] 之內(nèi)的標(biāo)識在編碼時只占用 1 字節(jié)荚守,[16,2047] 之內(nèi)的占用 2 字節(jié)珍德,所以應(yīng)該對那些頻繁出現(xiàn)的消息元素預(yù)留 [1,15] 之內(nèi)的標(biāo)識號

導(dǎo)入定義

  • 如果要使用的消息類型已在其它 .proto 文件中定義過,則可以通過導(dǎo)入其它 .proto 文件定義來使用它們
import "xxxx/xxx.proto";

字段類型

  • 字段類型參考如下圖

Java 使用 Protobuf

  • 編寫 gps_data.proto 描述文件
syntax = "proto3";

option java_package = "com.test"; 
option java_outer_classname = "GpsDataProto";

message gps_data {
    int64 id = 1;
    string terminalId = 2;
    string dataTime = 3;
    double lon = 4;
    double lat = 5;
    float speed = 6;
    int32 altitude = 7;
    int32 locType = 8;
    int32 gpsStatus = 9;
    float direction = 10;
    int32 satellite = 11;
}
  • 執(zhí)行下面命令編譯生成 Java 代碼
    • -I 后面是 proto 文件所在目錄
    • --java_out 后面是 java 文件存放地址
    • 最后一行是 proto 文件名稱
protoc -I=src/main/resource/proto --java_out=src/main/java gps_data.proto
  • 引入依賴
<dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java</artifactId>
    <version>3.5.1</version>
</dependency>
  • 在代碼中使用該類
public class Main {
    public static void main(String[] args) {
        System.out.println("===== 構(gòu)建一個GPS模型開始 =====");
        GpsDataProto.gps_data.Builder gps_builder = GpsDataProto.gps_data.newBuilder();
        gps_builder.setAltitude(1);
        gps_builder.setDataTime("2017-12-17 16:21:44");
        gps_builder.setGpsStatus(1);
        gps_builder.setLat(39.123);
        gps_builder.setLon(120.112);
        gps_builder.setDirection(30.2F);
        gps_builder.setId(100L);

        GpsDataProto.gps_data gps_data = gps_builder.build();
        System.out.println(gps_data.toString());
        System.out.println("===== 構(gòu)建GPS模型結(jié)束 =====");

        System.out.println("===== gps Byte 開始=====");
        for (byte b : gps_data.toByteArray()) {
            System.out.print(b);
        }
        System.out.println("\n" + "bytes長度" + gps_data.toByteString().size());
        System.out.println("===== gps Byte 結(jié)束 =====");

        System.out.println("===== 使用gps 反序列化生成對象開始 =====");
        GpsDataProto.gps_data gd = null;
        try {
            gd = GpsDataProto.gps_data.parseFrom(gps_data.toByteArray());
        } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }
        System.out.print(gd.toString());
        System.out.println("===== 使用gps 反序列化生成對象結(jié)束 =====");
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末矗漾,一起剝皮案震驚了整個濱河市锈候,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌敞贡,老刑警劉巖泵琳,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嫡锌,居然都是意外死亡虑稼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門势木,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛛倦,“玉大人,你說我怎么就攤上這事啦桌∷莺” “怎么了及皂?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長且改。 經(jīng)常有香客問我验烧,道長,這世上最難降的妖魔是什么又跛? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任碍拆,我火速辦了婚禮,結(jié)果婚禮上慨蓝,老公的妹妹穿的比我還像新娘感混。我一直安慰自己,他們只是感情好礼烈,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布弧满。 她就那樣靜靜地躺著,像睡著了一般此熬。 火紅的嫁衣襯著肌膚如雪庭呜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天犀忱,我揣著相機與錄音募谎,去河邊找鬼。 笑死阴汇,一個胖子當(dāng)著我的面吹牛近哟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鲫寄,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼疯淫!你這毒婦竟也來了地来?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤熙掺,失蹤者是張志新(化名)和其女友劉穎未斑,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體币绩,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蜡秽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了缆镣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芽突。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖董瞻,靈堂內(nèi)的尸體忽然破棺而出寞蚌,到底是詐尸還是另有隱情田巴,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布挟秤,位于F島的核電站壹哺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏艘刚。R本人自食惡果不足惜管宵,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望攀甚。 院中可真熱鬧箩朴,春花似錦、人聲如沸云稚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽静陈。三九已至燕雁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鲸拥,已是汗流浹背拐格。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刑赶,地道東北人捏浊。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像撞叨,于是被迫代替她去往敵國和親金踪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 由于工程項目中擬采用一種簡便高效的數(shù)據(jù)交換格式牵敷,百度了一下發(fā)現(xiàn)除了采用 xml胡岔、JSON 還有 ProtoBuf(...
    黃海佳閱讀 48,572評論 1 23
  • 文章內(nèi)容源自Google官方文檔翻譯,詳見原文Language Guide。部分內(nèi)容可能重復(fù)枷餐,望多見諒靶瘸。 假設(shè)你想...
    Jancd閱讀 2,123評論 0 0
  • 參考:http://www.reibang.com/p/8c6c009bc500 http://blog.csdn...
    F麥子閱讀 2,676評論 2 1
  • 絲絲縷縷千千萬萬 心盛滿了悲傷 就化作眼淚肆意流淌 夜是最好的屏障 誰也笑話不了 一個成年人獨自的傷感 像雨滴順著...
    喜樂心記閱讀 164評論 2 0
  • 作者:少女 圖片來源:pinterest 據(jù)說生養(yǎng)過的女人“一眼就能看出來”怨咪,最明顯特征就是「胯大屁股大」。 雖然...
    原子媽咪閱讀 572評論 0 1