Protobuf

github:https://github.com/protocolbuffers/protobuf
官方指南:https://developers.google.com/protocol-buffers/docs/overview

中文指南:

Overview (是什么)

  • Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准。
  • 含有超过 48,162 种报文格式定义和超过 12,183 个 .proto 文件。
  • 用途:Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据序列化。适合通讯、数据存储等。
    (1)Google用于 RPC 系统和持续数据存储系统。
    (2)可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。
  • 目前提供了 C++、Java、Python 三种语言的 API。

Install

github库 下载源码并编译。Ubuntu安装比较方便。

wget https://github.com/google/protobuf/releases/download/v2.4.1/protobuf-2.4.1.tar.gz
tar -xzf protobuf-2.4.1.tar.gz 
cd protobuf-2.4.1 
./configure
make 
make check # 这一步会报错,忽略即可,也可以跳过这一步
make install

安装完成后会在 /usr/local/bin 目录下生成一个可执行文件 protoc

ls /usr/local/bin/protoc
protoc --version  # 检查是否安装成功

在Ubuntu下一般会报错,protoc: error while loading shared libraries: libprotoc.so.8: cannot open shared,原因是 protobuf 的默认安装路径是/usr/local/lib,而/usr/local/lib 不在Ubuntu体系默认的 LD_LIBRARY_PATH里,所以就找不到该lib,解决方案:添加路径即可。

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

QuickStart

参考

Step 1. demo简介

  • 该程序(Protobuf & C++)由两部分组成。第一部分被称为 Writer,第二部分叫做 Reader。
  • Writer 负责将一些结构化的数据写入一个磁盘文件;
  • Reader 则负责从该磁盘文件中读取结构化数据并打印到屏幕上。

Step 2. 定义.proto文件

  • 结构化数据,被称为Message,类似 java 或者 C 语言的数据定义
package lm;  // package名字
message helloworld   // 消息名称,该消息含有3个成员
{ 
   required int32     id = 1;  // ID 
   required string    str = 2;  // str 
   optional int32     opt = 3;  //optional field, 可选成员,即消息中可以不包含该成员
}

Proto文件的命名规则packageName.MessageName.proto

Step 3. 编译.proto文件

// SRC_DIR:放置.proto的目录
// DST_DIR:输出.cc和.h文件的目录
protoc -I=$SRC_DIR --cpp_out=$DST_DIR
  • 将生成两个文件
    lm.helloworld.pb.h : 定义了 C++ 类的头文件
    lm.helloworld.pb.cc : C++ 类的实现文件
  • 在生成的头文件中,定义了一个 C++ 类 helloworld,后面的 Writer 和 Reader 将使用这个类来对消息进行操作。诸如对消息的成员进行赋值,将消息序列化等等都有相应的方法。

Step 4. 编写Writer 和 Reader

  • 为什么需要protobuf,数据的Read和Write,按理说其实有很多方法,但Read的码农,必须清楚了解Write的码农所用的格式和细节,比如123可以按照int存储也可以按照string存储
  • 使用protobuf的好处:
    (1)需要处理的结构化数据由.proto文件描述,Writer只需要include proto生成的.h文件就可以使用固定格式的类了。
    (2)protobuf集成了一系列全面鲁棒的方法来保证数据可以序列化和反序列化,可以放心的把数据存储交给protobuf
  • Writer代码
#include "lm.helloworld.pb.h"
int main(void) { 
  lm::helloworld msg1; 
  msg1.set_id(101);   // 设置 id 的值
  msg1.set_str(“hello”); 
     
  // Write the new address book back to disk. 
  fstream output("./log", ios::out | ios::trunc | ios::binary); 

  // SerializeToOstream 将对象序列化后写入一个 fstream 流
  if (!msg1.SerializeToOstream(&output)) { 
      cerr << "Failed to write msg." << endl; 
      return -1; 
  }         
  return 0; 
}
  • Reader代码
#include "lm.helloworld.pb.h" 
void ListMsg(const lm::helloworld & msg) { 
  cout << msg.id() << endl; 
  cout << msg.str() << endl; 
 } 
  
 int main(int argc, char* argv[]) { 
  // 声明类 helloworld 的对象 msg1
  lm::helloworld msg1; 
  { 
    fstream input("./log", ios::in | ios::binary); 
    // 利用 ParseFromIstream 从一个 fstream 流中读取信息并反序列化
    if (!msg1.ParseFromIstream(&input)) {
      cerr << "Failed to parse address book." << endl; 
      return -1; 
    } 
  } 
  // ListMsg 中采用 get 方法读取消息的内部信息
  ListMsg(msg1); 
}
  • 运行reader和writer结果如下:
>writer 
>reader 
101 
Hello
  • 把磁盘读写改为网络socket就可以扩展到RPC类的程序编写。
  • 存储和交换正是 Protobuf 最有效的应用领域。

竞品对比

  • 竞品:XML,JSON,Thrift

  • protobuf的优点:简单,快

  • 项目 thrift-protobuf-compare
    比较了这些类似的技术,图 1 显示了该项目的一项测试结果,Total Time.

    total time

  • Total Time 指一个对象操作的整个时间,包括创建对象,将对象序列化为内存中的字节序列,然后再反序列化的整个过程。从测试结果可以看到 Protobuf 的成绩很好,感兴趣的读者可以自行到网站

  • Protobuf 优点:
    (1)Protobuf 有如 XML,不过它更小、更快、也更简单。你可以定义自己的数据结构,然后使用代码生成器生成的代码来读写这个数据结构。修改简单。
    (2)即“向后”兼容性好:人们不必破坏已部署的、依靠“老”数据格式的程序就可以对数据结构进行升级。因为添加新的消息中的 field 并不会引起已经发布的程序的任何改变。方便升级和迁移代码。
    (3)Protobuf 语义更清晰,无需类似 XML 解析器的东西(因为 Protobuf 编译器会将 .proto 文件编译生成对应的数据访问类以对 Protobuf 数据进行序列化、反序列化操作)。
    (4)Protobuf 的编程模式比较友好,简单易学,同时它拥有良好的文档和示例。

  • Protobuf 缺点:
    (1)相比较 XML,Protobuf功能简单,无法用来表示复杂的概念。
    (2)XML 已经成为多种行业标准的编写工具,Protobuf 只是 Google 公司内部使用的工具,在通用性上还差很多。
    (3)由于文本并不适合用来描述数据结构,所以 Protobuf 也不适合用来对基于文本的标记文档(如 HTML)建模。另外,由于 XML 具有某种程度上的自解释性,它可以被人直接读取编辑,在这一点上 Protobuf 不行,它以二进制的方式存储,除非你有 .proto 定义,否则你没法直接读出 Protobuf 的任何内容。


推荐阅读:Protobuf更多高级应用和细节

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容

  • 一 简介 Google Protocol Buffer(简称Protobuf)是Google公司内部的混合语言数据...
    有何不可12317阅读 963评论 0 0
  • 之前在网络通信和通用数据交换等应用场景中经常使用的技术是 JSON 或 XML,而在最近的开发中接触到了 Goog...
    401阅读 499,519评论 25 379
  • protobuf是谷歌开源的一款高性能序列化框架,特点是性能优异,数据结构设计优秀并具有良好的可扩展性,并且配合官...
    暴走的初号机阅读 5,114评论 0 3
  • 本文节选自洪流学堂公众号技术专栏《大话Unity2019》,未经允许不可转载。 洪流学堂公众号回复专栏,查看更多专...
    洪智阅读 1,050评论 0 3
  • 1) 翻译:他即将开始新的职业生涯,做一位硬核说唱歌手。 He is about to embark on a n...
    平十阅读 283评论 0 0