Protocol buffers 介绍

Protocol buffers和mxl一样在序列化数据结构时很灵活、高效和智能,但是它的优势在于定义文件更小,读取速度更快,使用更加简单。目前protocol buffers支持C++、java和python三种语言并且独立于平台。

linux环境安装

下载protobuf-2.5.0.tar.gz

tar -xvf protobuf-2.5.0.tar.gz

./configure --prefix=/usr/local/protobuf-2.5.0

make

make install

安装成功后可将编译程序链接到系统bin目录下,以免每次使用都加绝对路径

ln -s /usr/local/protobuf-2.5.0/bin/protoc /usr/bin/protoc

linux安装完成!

使用步骤:

新建*.proto文件,并调用命令:protoc --cpp_out= *.proto编译即可生成C++的.h和cpp文件。

windows环境安装

下载 protobuf-2.5.0.zip

解压后使用VS打开vsprojects目录下的工程,编译生成protoc.exe、libprotobuf.lib,将protoc.exe放到windows目录下。

新建测试工程,链接libprotobuf.lib文件。新建test.proto文件,并在cmd控制台下输入命令即可生成头文件和源文件:

C:\Users\Administrator> protoc.exe -I=e:\protocbuf\include --cpp_out=e:\protocbuf\include\ e:\protocbuf\include\test.proto

protocbuf 语法

定义示例

option optimize_for = SPEED;

enum UserType

{

ORDINERY_USER = 0;    //普通用户

VIP_USER = 1;         //vip用户

}

message UserList

{

repeated User                     users                   = 1;

}

message User

{

required int32                    uid                    = 1;

optional int64                    guid                   = 2;

optional byte                     nick                     = 3;

optional string                   account                = 4;

optional UserType               type                  = 5[default=1];

}

protocbuf 使用message表示数据结构,类似c语言中的struct。

优化级别介绍

Protocol Buffer定义三种优化级别SPEED/CODE_SIZE/LITE_RUNTIME。缺省情况下是SPEED。

option optimize_for = SPEED;
    SPEED: 表示生成的代码运行效率高,但是由此生成的代码编译后会占用更多的空间。

CODE_SIZE: 和SPEED恰恰相反,代码运行效率较低,但是由此生成的代码编译后会占用更少的空间,通常用于资源有限的平台,如Mobile。
    LITE_RUNTIME: 生成的代码执行效率高,同时生成代码编译后的所占用的空间也是非常少。这是以牺牲Protocol Buffer提供的反射功能为代价的。

编译介绍

protoc --proto_path=IMPORT_PATH --cpp_out=DST_DIR --java_out=DST_DIR --python_out=DST_DIR path/to/file.prot

升级原则

在实际的开发中会存在这样一种应用场景,既消息格式因为某些需求的变化而不得不进行必要的升级,但是有些使用原有消息格式的应用程序暂时又不能被立刻升级,这便要求我们在升级消息格式时要遵守一定的规则,从而可以保证基于新老消息格式的新老程序同时运行。规则如下:
1. 不要修改已经存在字段的标签号。
2. 任何新添加的字段必须是optional和repeated限定符,否则无法保证新老程序在互相传递消息时的消息兼容性。
3. 在原有的消息中,不能移除已经存在的required字段,optional和repeated类型的字段可以被移除,但是他们之前使用的标签号必须被保留,不能被新的字段重用。
4. int32、uint32、int64、uint64和bool等类型之间是兼容的,sint32和sint64是兼容的,string和bytes是兼容的,fixed32和sfixed32,以及fixed64和sfixed64之间是兼容的,这意味着如果想修改原有字段的类型时,为了保证兼容性,只能将其修改为与其原有类型兼容的类型,否则就将打破新老消息格式的兼容性。
5. optional和repeated限定符也是相互兼容的

时间: 2024-10-24 20:20:54

Protocol buffers 介绍的相关文章

开源点评:Protocol Buffers介绍

今天来介绍一下“Protocol Buffers”(下面简称protobuf)这个玩意儿.本来俺在构思“生产者/消费者模式 ”系列的下一个帖子:关于生产者和消费者之间的传输数据格式.因为里面扯到了protobuf,想想干脆单独开一个帖子算了. ★protobuf是啥玩意儿? 为了照应从没听说过的同学,照例先来扫盲一把. 首先,protobuf是一个开源项目(官方网站在“这里 ”),并且是后台非常硬的开源项目.网上现有的大部分(至少80%)开源项目,要么是某人单干.要么是几个闲杂人等合伙搞.而pr

Protocol Buffers(Protobuf)开发者指南---概览

Protocol Buffers(Protobuf)开发者指南---概览 欢迎来到protocol buffers的开发者指南文档,protocol buffers是一个与编程语言无关‘.系统平台无关.可扩展的结构化数据序列化/反序列化工具,适用于通讯协议,数据存储等场合. ps:为了方便拼写,下文的protobuf就是指protocol buffers. 本文档的面向读者是:希望使用protobuf的 Java.C++.Python的开发者.此概览将向您介绍如何开始使用protobuf,然后您

Java使用Protocol Buffers入门四步骤

Protocol Buffers(简称protobuf)是谷歌的一项技术,用于将结构化的数据序列化.反序列化,经常用于网络传输. 这货实际上类似于XML生成和解析,但protobuf的效率高于XML,不过protobuf生成的是字节码,可读性比XML差.类似的还有json.Java的Serializable等. protobuf支持各种语言.本文以Java为例,简单介绍protobuf如何使用.其他语言使用方法类似. 首先需要下载: http://download.csdn.net/downlo

Protocol Buffers(Protobuf) 官方文档--Protobuf语言指南

Protocol Buffers(Protobuf) 官方文档--Protobuf语言指南 约定:为方便书写,ProtocolBuffers在下文中将已Protobuf代替. 本指南将向您描述如何使用protobuf定义i结构化Protobuf数据,包括.proto文件语法和如何使用.proto文件生成数据存取类. 作为一个参考指南,本文档将以示例的形式一步步向您介绍Protobuf的特点.您可以参考您所选择的语言的示例.tutorial ----------------------------

FlatBuffers vs Protocol Buffers

FlatBuffers去年发布,最近看了一下,与同是出自Google之手的Protocol Buffers非常类似.在官网上介绍,FlatBuffers(简称FB)主要针对game development和对性能有要求的应用.相对于Protocol Buffers(简称PB),FB不需要解析,只通过序列化后的二进制buffer即可完成数据访问. FB的主要特点有: 1)数据访问不需要解析 将数据序列化成二进制buffer,之后的数据访问直接读取这个buffer,所以读取的效率很高. 2)内存高效

Protocol Buffers(protobuf)java初体验

由于项目需要所以简单的研究了下protobuf.我也是参照网上的博客,所以大部分内容我也就不重复造轮子了.首先protobuf介绍点击这里,使用介绍点击这里,使用demo看这里.我个人的第一个例子也是参照这个demo来的,不过其中我有遇到一些问题,所以揪出来说说,也就给自己做个笔记,方便查阅. 基本的东西相信大家也了解了,直接步入主题了: 1.限定修饰符介绍 required\optional\repeated,之前给定的博客已经有这个介绍了我也不多说,这里把一些小玩儿拿出来讲讲 ①.requi

使用 Protocol Buffers 代替 JSON 的五个原因

在Ruby和Rails开发者中,面向服务(Service-Oriented)架构有一个当之无愧的名声,它是一个缓解程序规模恶性增长的一个强有力的途径,可在大量应用程序中提取关注点.这些新生小巧的服务通常继续使用Rails或Sinatra,并使用JSON在HTTP上通信.尽管JSON作为一个数据相互交换格式,有很多优点:人类可读.可理解,并通常表现出色. 浏览器和JS并不直接处理数据--尤其是遇到内部服务时.我的观点是,结构化格式,例如谷歌的Protocol Buffers,是一个比JSON在编码

(转)Protocol Buffers for C

我一直不太满意 google protocol buffers 的默认设计.为每个 message type 生成一大坨 C++ 代码让我很难受.而且官方没有提供 C 版本,第三方的 C 版本 也不让我满意. 这种设计很难让人做动态语言的 binding ,而大多数动态语言往往又没有强类型检查,采用生成代码的方式并没有特别的好处,反而有很大的性能损失(和通常做一个 bingding 库的方式比较).比如官方的 Python 库,完全可以在运行时,根据协议,把那些函数生成出来,而不必用离线的工具生

Google Protocol Buffers 概述 转

Google Protocol Buffers 概述 个人小站,正在持续整理中,欢迎访问:http://shitouer.cn 小站博文地址:Google Protocol Buffers 概述 推荐阅读顺序,希望给你带来收获~ <Google Protocol Buffers 概述> <Google Protocol Buffers 入门> <Protocol Buffers 语法指南> <Google Protocol Buffers 编码(Encoding)