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 根據指引填寫資訊和提交相應的資料,就可以擁有自己的小程式帳號。註冊完成之後開始登入。