博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
google protocol buffer
阅读量:2171 次
发布时间:2019-05-01

本文共 2282 字,大约阅读时间需要 7 分钟。

Google Protocol Buffer 的使用和原理
Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 .proto 文件。他们用于 RPC 系统和持续数据存储系统。
Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。

简单说来 Protobuf 的主要优点就是:简单,快。具体数据可参看下面link:

简单例子:

1. 安装 Google Protocol Buffer
2. 书写 .proto 文件
首先我们需要编写一个 proto 文件,定义我们程序中需要处理的结构化数据,在 protobuf 的术语中,结构化数据被称为 Message。proto 文件非常类似 java 或者 C 语言的数据定义。代码清单 1 显示了例子应用中的 proto 文件内容。
清单 1. proto 文件
package lm;
message helloworld
{
required int32 id = 1; // ID
required string str = 2; // str
optional int32 opt = 3; //optional field
}
3.编译 .proto 文件
写好 proto 文件之后就可以用 Protobuf 编译器将该文件编译成目标语言了。本例中我们将使用 C++。
假设您的 proto 文件存放在 SRCDIR使protocI= S R C D I R 下 面 , 您 也 想 把 生 成 的 文 件 放 在 同 一 个 目 录 下 , 则 可 以 使 用 如 下 命 令 : p r o t o c − I = SRC_DIR --cpp_out= DSTDIR D S T D I R SRC_DIR/addressbook.proto
命令将生成两个文件:
lm.helloworld.pb.h , 定义了 C++ 类的头文件
lm.helloworld.pb.cc , C++ 类的实现文件
在生成的头文件中,定义了一个 C++ 类 helloworld,后面的 Writer 和 Reader 将使用这个类来对消息进行操作。诸如对消息的成员进行赋值,将消息序列化等等都有相应的方法。
4.编写 writer 和 Reader
Writer:

#include "lm.helloworld.pb.h"… int main(void) {  lm::helloworld msg1;  msg1.set_id(101);  msg1.set_str(“hello”);  // Write the new address book back to disk.  fstream output("./log", ios::out | ios::trunc | ios::binary);  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[]) {  lm::helloworld msg1;  {    fstream input("./log", ios::in | ios::binary);    if (!msg1.ParseFromIstream(&input)) {      cerr << "Failed to parse address book." << endl;      return -1;    }  }  ListMsg(msg1);  … }

  1. 运行结果
    运行 Writer 和 Reader 的结果如下:

writer

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

Google Protocol Buffer的安装与.proto文件的定义

转载地址:http://mpqzb.baihongyu.com/

你可能感兴趣的文章
【LEETCODE】12-Integer to Roman
查看>>
【学习方法】如何分析源代码
查看>>
【LEETCODE】61- Rotate List [Python]
查看>>
【LEETCODE】143- Reorder List [Python]
查看>>
【LEETCODE】82- Remove Duplicates from Sorted List II [Python]
查看>>
【LEETCODE】86- Partition List [Python]
查看>>
【LEETCODE】147- Insertion Sort List [Python]
查看>>
【算法】- 动态规划的编织艺术
查看>>
用 TensorFlow 让你的机器人唱首原创给你听
查看>>
对比学习用 Keras 搭建 CNN RNN 等常用神经网络
查看>>
深度学习的主要应用举例
查看>>
word2vec 模型思想和代码实现
查看>>
怎样做情感分析
查看>>
用深度神经网络处理NER命名实体识别问题
查看>>
用 RNN 训练语言模型生成文本
查看>>
RNN与机器翻译
查看>>
用 Recursive Neural Networks 得到分析树
查看>>
RNN的高级应用
查看>>
TensorFlow-7-TensorBoard Embedding可视化
查看>>
轻松看懂机器学习十大常用算法
查看>>