google protocol buffer的原理和使用(四)

原创 2015年07月10日 10:21:55

有个电子商务的系统(假设用C++实现),其中的模块A需要发送大量的订单信息给模块B,通讯的方式使用socket。
假设订单包括如下属性:
--------------------------------
  时间:time(用整数表示)
  客户id:userid(用整数表示)
  交易金额:price(用浮点数表示)
  交易的描述:desc(用字符串表示)
--------------------------------
  如果使用protobuf实现,首先要写一个proto文件(不妨叫Order.proto),在该文件中添加一个名为"Order"的message结构,用来描述通讯协议中的结构化数据。该文件的内容大致如下:

--------------------------------

message Order
{
  required int32 time = 1;
  required int32 userid = 2;
  required float price = 3;
  optional string desc = 4;
}

--------------------------------


  然后,使用protobuf内置的编译器编译 该proto。由于本例子的模块是C++,你可以通过protobuf编译器的命令行参数(看“这里 ”),让它生成C++语言的“订单包装类”。(一般来说,一个message结构会生成一个包装类)
  然后你使用类似下面的代码来序列化/解析该订单包装类:


--------------------------------

// 发送方

Order order;
order.set_time(XXXX);
order.set_userid(123);
order.set_price(100.0f);
order.set_desc("a test order");

string sOrder;
order.SerailzeToString(&sOrder);

// 然后调用某种socket的通讯库把序列化之后的字符串发送出去
// ......

--------------------------------

// 接收方

string sOrder;
// 先通过网络通讯库接收到数据,存放到某字符串sOrder
// ......

Order order;
if(order.ParseFromString(sOrder))  // 解析该字符串
{
  cout << "userid:" << order.userid() << endl
          << "desc:" << order.desc() << endl;
}
else
{
  cerr << "parse error!" << endl;
}

--------------------------------


  有了这种代码生成机制,开发人员再也不用吭哧吭哧地编写那些协议解析的代码了(干这种活是典型的吃力不讨好)。
  万一将来需求发生变更,要求给订单再增加一个“状态”的属性,那只需要在Order.proto文件中增加一行代码。对于发送方(模块A),只要增加一行设置状态的代码;对于接收方(模块B)只要增加一行读取状态的代码。哇塞,简直太轻松了!
  另外,如果通讯双方使用不同的编程语言来实现,使用这种机制可以有效确保两边的模块对于协议的处理是一致的。
  顺便跑题一下。
  从某种意义上讲,可以把proto文件看成是描述通讯协议的规格说明书(或者叫接口规范)。这种伎俩其实老早就有了,搞过微软的COM编程或者接触过CORBA的同学,应该都能从中看到IDL(详细解释看“这里 ”)的影子。它们的思想是相通滴。

[转]Google Protocol Buffer 的使用和原理

简介: Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式。它可用于通讯协议、数据存储等领域的语言无关、平台无关、...

Google protocol buffer文件的原理和使用

在此学习.protoc文件,在网上有一篇博文写的很好,转了下: 原文地址:http://blog.csdn.net/majianfei1023/article/details/4511241...

google protocol buffer的原理和使用(二)

本文主要会介绍怎么使用Google Protocol的Lib来序列化我们的数据,方法很多种,本文只介绍其中的三种,其他的方法读者可以通过自行研究摸索。但总的来说,序列化数据总的来说分为以下俩步:   ...

google protocol buffer的原理和使用(三)

介绍下怎么反序列化GoogleBuffer数据,并在最后提供本系列文章中所用到的代码整理供下载。      上一篇文章介绍了怎样将数据序列化到了addressbook.data中,那么对于接受方而言...

Google Protocol Buffer 的使用和原理

很详细的关于protobuff的介绍,先收藏之! 简介什么是 Google Protocol Buffer? 假如您在网上搜索,应该会得到类似这样的文字介绍:Google Protocol Buffe...

Google Protocol Buffer的使用和原理

么是 Google Protocol Buffer? 假如您在网上搜索,应该会得到类似这样的文字介绍: Google Protocol Buffer( 简称 Protobuf) 是 Google...

Google protocol buffer 使用和原理浅析 And 进阶使用方式之PbCodec

Google Protocol Buffer又简称Protobuf,它是一种很高效的结构化数据存储格式,一般用于结构化数据的串行化,简单说就是我们常说的数据序列化。这种序列化的协议非常轻便高效,而且是...

Google Protocol Buffer原理

GoogleProtocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 ....

Google Protocol Buffer(GPB)使用之完全解析二:有了GPB的日子怎么过?什么是GPB?

通过前面博文的学习,我们知道:没有GPB,客户端的日子很难过,现在略作回顾,没有GPB的日子是这样的:  #include #include using namespace std; int ...
  • stpeace
  • stpeace
  • 2013年06月23日 13:45
  • 2831

在python中使用google protocol buffer

今天想要写个python脚本来把我们之前一个项目中使用的gpb格式导出的数据打印出来,由于之前接触python很少,所以基本是从头学起 基本的语法的话我就不说了,我主要记录一下我的几个环境配置 p...
  • kerlw
  • kerlw
  • 2011年05月20日 12:36
  • 3490
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:google protocol buffer的原理和使用(四)
举报原因:
原因补充:

(最多只允许输入30个字)