1. 程式人生 > >Google protocol buffer檔案的原理和使用

Google protocol buffer檔案的原理和使用

在此學習.protoc檔案,在網上有一篇博文寫的很好,轉了下:

一.什麼是protobuf

protobuf全稱Google Protocol Buffers,是google開發的的一套用於資料儲存,網路通訊時用於協議編解碼的工具庫。它和XML或者JSON差不多,也就是把某種資料結構的資訊,以某種格式(XML,JSON)儲存起來,protobuf與XML和JSON不同在於,protobuf是基於二進位制的。主要用於資料儲存、傳輸協議格式等場合。那既然有了XML等工具,為什麼還要開發protobuf呢?主要是因為效能,包括時間開銷和空間開銷:

1.時間開銷:XML格式化(序列化)和XML解析(反序列化)的時間開銷是很大的,在很多時間效能上要求很高的場合,你能做的就是看著XML乾瞪眼了。

2.空間開銷:熟悉XML語法的同學應該知道,XML格式為了有較好的可讀性,引入了一些冗餘的文字資訊。所以空間開銷也不是太好(應該說是很差,通常需要實際內容好幾倍的空間)。

據實驗(當然不是我實驗),一條訊息資料,用protobuf序列化後的大小是json格式的十分之一,xml格式的二十分之一。

這一篇主要講protobuf用作資料儲存方面,下一篇講用作rpc通訊協議方面。

二.使用protobuf

protobuf的使用很簡單,開發人員按照一定的語法定義結構化的訊息格式,然後用自帶的編譯工具,工具將自動生成相關的類,官方支援Java、c++、Python語言環境(當然可以在網上找到很多支援其他語言的封裝,當然你也可以自己寫一個,只要符合google定義的格式)。通過將這些類包含在專案中,可以很輕鬆的呼叫相關方法來完成業務訊息的序列化與反序列化工作。


1.定義報文格式。protobuf檔案的字尾是proto,是一種類似c++或者java的語法。使用protoc.exe(windows平臺下,你可以下載原始碼編譯,也可以網上直接下載exe,這個大家自行Google)把proto檔案編譯成c++,java或者python就可以使用了。

  1. package tutorial;  
  2. message Person {  
  3.   required string name = 1;  
  4.   required int32 age = 2;  
  5.   optional string email = 3;  
  6. }  

在這裡定義了一個Person,我們只是簡單的定義了name,age和email。這裡注意,在上例中,package 名字叫做 tutorial,相當於c++的namespace,定義了一個訊息 Person,該訊息有3個成員,型別為 string 的 name,型別為 int32 的成員 age和型別為string的email。optional 代表這是一個可選的成員,即訊息中可以不包含該成員,required代表是必須的。

寫好proto之後把proto放在protoc.exe相同目錄,然後在此目錄使用指令:protoc --cpp_out=d:\proto person.proto(我們使用的是c++)。當用protocolbuffer編譯器來執行.proto檔案時,編譯器將生成所選擇語言的程式碼,這些程式碼可以操作在.proto檔案中定義的訊息型別,包括獲取、設定欄位值,將訊息序列化到一個輸出流中,以及從一個輸入流中解析訊息。

就可以生成person.pb.h,person.pb.cc.在生成的標頭檔案中,定義了一個 C++ 類 Person,繼承自google::protobuf::Message,後面我們進行對Person資料的檔案讀寫, 將使用這個類來對訊息進行操作。諸如對訊息的成員進行賦值,將訊息序列化等等都有相應的方法。

首先,把資料寫入disk:

  1. #include <iostream>
  2. #include<fstream>
  3. #include "person.pb.h"
  4. #pragma comment(lib, "libprotobuf.lib")
  5. #pragma comment(lib, "libprotoc.lib")
  6. usingnamespace std;  
  7. usingnamespace tutorial;  
  8. int main()  
  9. {  
  10.     Person person;  
  11.     person.set_name("flamingo");     
  12.     person.set_age(18);   
  13.     person.set_email("[email protected]");  
  14.     // Write
  15.     fstream output("./log", ios::out | ios::trunc | ios::binary);  
  16.     if (!person.SerializeToOstream(&output)) {  
  17.         cerr << "Failed to write msg." << endl;  
  18.         return -1;  
  19.     }  
  20.     system("pause");  
  21.     return 0;  
  22. }  

namespace tutorial就是我們之前定義的package,我們先定義一個Person,然後給Person賦值,其中set_name,set_age,set_email是根據proto自動生成的,我們使用SerializeToOstream 將物件序列化成二進位制(導致了可讀性差的問題,這算是protobuf的一個缺點吧)後寫入一個 fstream 流。

然後在從disk讀出Person的資料:

  1. #include <iostream>
  2. #include<fstream>
  3. #include "person.pb.h"
  4. #pragma comment(lib, "libprotobuf.lib")
  5. #pragma comment(lib, "libprotoc.lib")
  6. usingnamespace std;  
  7. usingnamespace tutorial;  
  8. void PrintInfo(const Person & person) {   
  9.     cout << person.name() << endl;   
  10.     cout << person.age() << endl;   
  11.     cout << person.email() << endl;  
  12. }   
  13. int main()  
  14. {  
  15.     Person person;    
  16.     fstream input("./log", ios::in | ios::binary);  
  17.     if (!person.ParseFromIstream(&input)) {  
  18.         cerr << "Failed to parse address book." << endl;  
  19.         return -1;  
  20.     }  
  21.     PrintInfo(person);  
  22.     system("pause");  
  23.     return 0;  
  24. }  


主要是利用 ParseFromIstream 從一個 fstream 流中讀取序列化的資訊並反序列化。

相關推薦

Google protocol buffer檔案原理使用

在此學習.protoc檔案,在網上有一篇博文寫的很好,轉了下: 一.什麼是protobuf protobuf全稱Google Protocol Buffers,是google開發的的一套用於資料儲存,網路通訊時用於協議編解碼的工具庫。它和XML或者JSON差不多

Google Protocol Buffer 的使用原理

簡介 Google Protocol Buffer( 簡稱 Protobuf) 是 Google 公司內部的混合語言資料標準。Protobuf是一種輕便高效的結構化資料儲存格式,可以用於結構化資料序列化,或者說序列化。它很適合做資料儲存或 RPC 資料交換格式。可用於通

從環境搭建開始學習使用Google Protocol BuffergRPC

首先安裝 golang/protobuf Golang 語言版本的 API 時,需要先安裝標準 C++ 實現的 protocol buffer google/protobuf,使用linux的話就是先到github上下載對應的二進位制檔案 下載完解壓之後將bin目錄加

eclipse4.4的google protocol buffer的proto檔案編輯器Protocol Buffer Editor安裝

eclipse4.4的proto檔案編輯器Protocol Buffer Editor安裝 google protocol buffer 檔案編輯器。 外掛專案名稱為protobuf-dt,是託管在google code上,國內現在已經連線不上google code了,在e

Google Protocol Buffer 傳輸資料相對其他格式較短的原理

原文連結: http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/, 作者:劉明 Google Protocol Buffer 的 Encoding Protobuf 序列化後所生成的二進位制訊息非常緊湊,這得益於

【小松教你手遊開發】【unity實用技能】Google Protocol Buffer(protobuf) 使用研究

由於專案使用的是c#,所以下面的範例也是用於c# 一、安裝Google Protocol Buffer 二、編寫一個bat檔案處理檔案,批量生成c#檔案,如: @echo off SETLOCAL ENABLEDELAYEDEXPANSION rem 查詢檔案

Google protocol buffer 的反射機制應用

何謂反射? 我在工作中大量使用了 google protocal buffer, 為了方便描述, 下文簡稱為 pb. pb 的作用和基本使用方法在這裡就不再陳述, 相關的文章網上很多.  這裡主要介紹 pb 的反射機制. 什麼是反射機制呢? 該機制能在執行時, 對於任

關於google protocol buffer(PB)的優缺點一些個人的理解

--------------------------------   網路名稱:name   網路型別:type   卷積層引數:convolution_param --------------------------------   如果使用protobuf實現,首先要寫一個proto檔案(不妨叫VGG.

google protocol buffer——protobuf的基本使用模型分析

這一系列文章主要是對protocol buffer這種編碼格式的使用方式、特點、使用技巧進行說明,並在原生protobuf的基礎上進行擴充套件和優化,使得它能更好地為我們服務。   1.什麼是protobuf protocol buffer是由google推出一種資料編碼格式,不依賴平臺和語言,類似

google protocol buffer——protobuf的使用特性及編碼原理

這一系列文章主要是對protocol buffer這種編碼格式的使用方式、特點、使用技巧進行說明,並在原生protobuf的基礎上進行擴充套件和優化,使得它能更好地為我們服務。   在上一篇文章中,我們展示了protobuf在java中的基本使用方式。而本文將繼續深入探究protobuf的編碼原理。

google protocol buffer——protobuf的編碼原理

這一系列文章主要是對protocol buffer這種編碼格式的使用方式、特點、使用技巧進行說明,並在原生protobuf的基礎上進行擴充套件和優化,使得它能更好地為我們服務。   在上一篇文章中,我們主要通過一些示例瞭解了protobuf的使用特性,以及和這些特性相關的基礎編碼原理。 編碼原理只開

google protocol buffer——protobuf的問題改進2

這一系列文章主要是對protocol buffer這種編碼格式的使用方式、特點、使用技巧進行說明,並在原生protobuf的基礎上進行擴充套件和優化,使得它能更好地為我們服務。 在上一篇文章中,我們舉例了在移動網際網路場景下原生protobuf類庫使用上的問題,並且自己完成了一個java的編碼類庫。本文中將

Google Protocol Buffer入門

解釋 -- rate plugin gcc 入門 新增 查找 abs 簡介 Google Protocol Buffer( 簡稱 Protobuf) 是 Google 公司內部的混合語言數據標準,目前已經正在使用的有超過 48,162 種報文格式定義和超過 12,183 個

Google Protocol Buffer

長度 .com ID 成員 得到 規模 c 語言 ostream HR 簡介 什麽是 Google Protocol Buffer? 假如您在網上搜索,應該會得到類似這樣的文字介紹: Google Protocol Buffer( 簡稱 Protobuf) 是 Google

windows下Google Protocol Buffer 編譯安裝使用教程

轉載修改自:http://kuaile.in/archives/1214 protobuf的全稱是Protocol Buffer,它是google 的一種資料交換的格式,可用於用於分散式應用之間的資料通訊或者異構環境下的資料交換, 最近因為專案的需求,需要接觸Protobuf,在官方提供的壓縮包

C++ Class Mapped Google Protocol Buffer Message

摘要 Google Protocol Buffer 是一個優秀的基於二進位制的網路訊息編解碼框架。應用於專案時,可以節省不少的人力資源、開發時間和程式BUG。但其不足之處是protobuf編譯器生成的C++訊息類(或者Java等其他語言的訊息類)冗餘資料過多,需要依賴於pro

Android 使用Google Protocol buffer協議

什麼是 Protocol buffer 它是用於對結構化資料進行序列化的一種靈活、高效、自動化的機制——類似XML,但是更小、更快、更簡單。您可以定義資料的結構化方式,然後使用特殊生成的原始碼輕鬆地在各種資料流和使用的各種語言之間讀寫結構化資料。 對於使用 J

Google Protocol Buffer 的使用(一)

一、什麼是Google Protocol Buffer下面是官網給的解釋:Protocol buffers are a language-neutral, platform-neutral extensible mechanism for serializing structured data. – thin

Google Protocol Buffer 的使用(二) Google Protocol Buffer 的使用(一)

一、protobuf應用場景 protobuf 在Java中的應用場景可以是序列化和反序列化,流可以通過檔案或者通過網路TCP/UDP等方式傳輸。新建一個.proto檔案 syntax = "proto3"; option java_package = "com.test.proto"; optio

Google Protocol Buffer 簡單介紹

以下內容主要整理自官方文件。 為什麼使用 Protocol Buffers 通常序列化和解析結構化資料的幾種方式? 使用Java預設的序列化機制。這種方式缺點很明顯:效能差、跨語言性差。 將資料編碼成自己定義的字串格式。簡單高效,但是僅適合比較簡單的資料格式。 使用XML序列化。比較普遍的做