1. 程式人生 > >Google Protocol Buffer序列化入門實戰(附原始碼)

Google Protocol Buffer序列化入門實戰(附原始碼)

Google Protocol Buffer入門實戰(附原始碼)

Google Protocol Buffer(後面簡稱PB)是Google開源的一款二進位制序列化工具,佔用空間小,傳輸效率高。最近由於專案中使用到了PB,所以特地學習了PB,這篇文章也是自己學習PB的一些小結。

根據官方定義,PB是一個語言中立,平臺中立的,用於序列化結構化資料的協議。

說到序列化,可能大家最容易想到的是JDK自帶的序列化協議,使用PB而不使用自帶的序列化協議主要基於以下幾點考慮:

  • 佔用空間希望儘可能小
  • 傳輸效率儘可能高
  • 跨平臺

那麼,JDK自帶的序列化就不能滿足需求了,而且PB將資料序列化成二進位制資料,大大降低空間佔用。PB的優勢主要體現在以下幾點:

  • 更簡單
  • 降低3-10倍的佔用空間
  • 20至100倍的速度提升
  • 低侵入性
  • 更易於程式設計的資料訪問類

PB入門實戰

使用PB也是極其簡單的,首先需要定義一個字尾為.proto的檔案,然後使用PB編譯器生成資料訪問類,使用PB的API讀寫資料。需要下載PB編譯器執行編譯,然後在IDE中下載PB外掛。

以IntelliJ IDEA為例,可以安裝Google Protocol Buffers support外掛,在Plugins欄目中選擇Browse repositories,在搜尋框中搜索Google Protocol Buffers support,出現下圖,點選安裝,之後重啟IDEA就可以了。

這裡寫圖片描述

建立Maven工程,配置PB編譯器的安裝路徑(文後有下載地址):

這裡寫圖片描述

pom.xml依賴檔案:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.rhwayfun</groupId> <artifactId>protocol-buffer-demo</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>2.5.0</version> </dependency> </dependencies> </project>

安裝之後就需要編寫.proto的檔案了,作為示例,程式碼如下:

package com.rhwayfun.demo;

message Person {
    required string name = 1;
    required int32 id = 2;
    optional string email = 3;

    enum PhoneType {
        MOBILE = 0;
        HOME = 1;
        WORK = 2;
    }

    message PhoneNumber {
        required string number = 1;
        optional PhoneType type = 2 [default = HOME];
    }

    repeated PhoneNumber phone = 4;
}

因為是Maven工程,因此需要配置PB編譯器的編譯路徑,在IDEA中配置如下:

這裡寫圖片描述

使用PB編譯器編譯後的結果如下:

// Generated by the protocol buffer compiler.  DO NOT EDIT!
// source: PersonMessage.proto

package com.rhwayfun.demo;

public final class PersonMessage {
  private PersonMessage() {}
  public static void registerAllExtensions(
      com.google.protobuf.ExtensionRegistry registry) {
  }
  public interface PersonOrBuilder extends
      // @@protoc_insertion_point(interface_extends:com.rhwayfun.demo.Person)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>required string name = 1;</code>
     */
    boolean hasName();
    /**
     * <code>required string name = 1;</code>
     */
    java.lang.String getName();
    /**
     * <code>required string name = 1;</code>
     */
    com.google.protobuf.ByteString
        getNameBytes();

    /**
     * <code>required int32 id = 2;</code>
     */
    boolean hasId();
    /**
     * <code>required int32 id = 2;</code>
     */
    int getId();

    /**
     * <code>optional string email = 3;</code>
     */
    boolean hasEmail();
    /**
     * <code>optional string email = 3;</code>
     */
    java.lang.String getEmail();

    // 此處省略其他程式碼

編寫測試程式碼如下:

package com.rhwayfun.demo;

import org.junit.Test;

import static org.junit.Assert.*;

/**
 * @Description: PersonOuterClassTest
 * @author: ZhongCB
 * @date: 2016/08/09
 */
public class PersonMessageTest {

    @Test
    public void testMakeInstance(){
        PersonMessage.Person person = PersonMessage.Person.newBuilder().setId(1)
                .setEmail("[email protected]")
                .setName("rhwayfun").build();
        assertEquals(person.getName(), "rhwayfun");
        assertEquals(person.getEmail(), "[email protected]");
    }
}

最後的執行結果如下:

執行結果

附原始碼和PB編譯器下載地址:下載地址

相關推薦

Google Protocol Buffer序列化入實戰原始碼

Google Protocol Buffer入門實戰(附原始碼) Google Protocol Buffer(後面簡稱PB)是Google開源的一款二進位制序列化工具,佔用空間小,傳輸效率高。最近由於專案中使用到了PB,所以特地學習了PB,這篇文章也是自己學

Dubbo分散式服務框架入門實戰原始碼

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

無人駕駛--車道線檢測實戰原始碼

做完專案後寫了個技術小結,供自己回顧也為他人學習提供參考。 另外準備建一個無人駕駛方面的微信交流群,有興趣的朋友可以加我微信:wxl609278502 請註明: 姓名-單位/學校 專案描述: 使用opencv實時處理車載攝像機採集的道路影象

Flutter | Json自動反序列化——json_serializable原始碼 【3】

轉載自:https://www.jianshu.com/p/b307a377c5e8   前言 Google推出flutter這樣一個新的高效能跨平臺(Android,ios)快速開發框架之後,被業界許多開發者所關注。我在接觸了flutter之後發現這個確實是一個好東西,好東西

知識圖譜完整專案實戰原始碼)1

一、前言 本文是《知識圖譜完整專案實戰(附原始碼)》系列博文的第一篇,主要介紹課程設定的初衷和綱要。知識圖譜的學習是一個基礎到實戰,從入門到精通的一個逐漸深入的、漸進式的過程。在這個過程中,一個完整的專案,起到的作用往往是對過往所學全部知識的串聯和融合。只有經過一個完整專案的實踐,才能真正把所學的、離散

Flutter | Json自動反序列化——json_serializable原始碼

前言 Google推出flutter這樣一個新的高效能跨平臺(Android,ios)快速開發框架之後,被業界許多開發者所關注。我在接觸了flutter之後發現這個確實是一個好東西,好東西當然要和大家分享,對吧。 今天要跟大家分享的是Json反序列化的實現。相信做

【休閒遊戲 實戰1】推箱子PC端小遊戲原始碼

效果圖:第100關有些難度,用了449步才過關(我用的是可跳關版的,直接玩的最後一關)原始碼解讀原始碼一共3個檔案:index.html(遊戲介面載入,核心功能),js/mapdata100.js(100個16階矩陣,通過0,1,2,3,4分別對應遊戲中5個元素的圖片來定義每

Swift4今日頭條專案實戰視訊+原始碼

Swift4專案實戰 本系列視訊實戰教程需要有 Swift 語言基礎,並且有過 iOS 開發相關經驗,讚賞後可新增QQ 1442691978 提供讚賞截圖索要視訊及原始碼! 視訊目錄 1.專案搭建

Google Spreadsheet Add-on Links Extractor 谷歌表格外掛連結提取器的製作與釋出原始碼

引言 為什麼想到製作這麼一個外掛呢,是因為博主在更新微信公眾號【刷盡天下】的後臺資料庫時,需要有部落格園題目帖子的連結,那麼就要從這篇帖子 LeetCode All in One 題目講解彙總(持續更新中...) 中提取各個題目的連結。之前博主都是使用的都是Excel的外掛 Kutools 來完成的,但是這個

機器學習專案的例項分析設計原始碼

摘要說明: 最近在學習“Hands-On Machine Learning with Scikit-Learn &TensorFlow”,其中一些機器學習的思考和處理方式很具有專案級開發的特點。我在原文提供的例項基礎上,結合自己的分析,模擬了一個機器學習專案的分析和實現過程,包括專

mysql 使用 limit 實現底層分頁原始碼

原理解析: <select id="queryProductList" resultType="com.pojo.Product"> SELECT * FROM tb_product ORDER BY priority DESC LIMIT #{rowIndex},#{p

使用高德地圖微信小程式SDK開發案例-輸入提示原始碼

閒來無事寫一篇使用高德地圖的微信小程式SDK開發應用的例項。 接下來先看需求: 我們要做的是,根據使用者輸入的關鍵詞,給出相應的提示資訊,列表中顯示地方的名稱,地方的詳細地址以及對應的經緯度座標。 當然在UI上我們儘量做到理想的視覺與較好的使用者體驗。 最終的效果我們希望是像這樣的,

乾貨原始碼 | 爬取一萬條b站評論,分析9.7分的新番憑啥這麼火?

7月番《工作細胞》最終話在十一前放出。這部動漫在b站上評分高達9.7。除了口碑之外,熱度也居高不下,更值得關注的是連很多平時不關注動漫的小夥伴也加入了追番大軍。這次我們的目標是爬取b站上的所有短評進行分析,用資料說明為什麼這部動漫會如此受歡迎。 01 工作細胞 《工作細胞》

CVPR論文《100+ Times FasterWeighted Median Filter (WMF)》的實現和解析(附原始碼)。 任意半徑中值濾波擴充套件至百分比濾波器O(1)時間複雜度演算法的原理、實現及效果 任意半徑中值濾波擴充套件至百分比濾波器O(1)時間複雜度演算法的原理、實現及

  四年前第一次看到《100+ Times FasterWeighted Median Filter (WMF)》一文時,因為他附帶了原始碼,而且還是CVPR論文,因此,當時也對程式碼進行了一定的整理和解讀,但是當時覺得這個演算法雖然對原始速度有不少的提高,但是還是比較慢。因此,沒有怎麼在意,這幾天有幾位朋友

Java程式設計師從笨鳥到菜鳥之八十二細談Spring十一深入理解spring+struts2整合原始碼

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

俄羅斯方塊實驗報告原始碼

C++面向物件程式綜合設計 一、基本要求 1、綜合實驗設計可採取一人一設計,也可以組成小組,每組成員(不得超過4人)分工合作完成一個設計,每個人的任務不同。 2、要求利用面向物件程式設計方法以及C++的程式設計思想來完成系統的設計。 3、要求有選單、檔案操作,資料使用陣列、結構體等均可,鍵盤

安卓識別身份證,自動提取身份證資訊功能實現原始碼

原始碼下載地址:注:原始碼裡沒有騰訊優圖的賬號需要填寫自己的 下載地址 先講幾下.首先我們需要去騰訊優圖申請一個賬號,因為身份證識別需要用到第三方介面如圖所示 我申請的是掃描身份證,當然還有其他的功能,比如掃描銀行卡,營業執照,車牌等等  ,大家可以去研究一下

python實現Excel檔案讀取的程式原始碼

python實現Excel檔案讀取的程式   前一段時間幫一個朋友用python寫了一個讀Excel程式操作的程式,具體要求為:讀取兩個Excel檔案,根據其中某個特徵的特徵值對這兩個檔案進行取交集操作,生成三個Excel檔案,第一個Excel檔案為這兩個檔案的公

C#設計模式02-抽象工廠模式原始碼

        抽象工廠模式是所有工廠模式中最為抽象的模式,是抽象程度最高的模式,也是最難理解的一種工廠模式。         現在舉一個生活中的案例來

微信小程式入門教程原始碼

五分鐘上手-微信小程式 1:用沒有註冊過微信公眾平臺的郵箱註冊一個微信公眾號, 申請帳號 ,點選 https://mp.weixin.qq.com/wxopen/waregister?action=step1 根據指引填寫資訊和提交相應的資料,就可以擁有自己的小程式帳號。註冊完成之後開始登入。