Protocol buffers 介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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限定符也是相互兼容的

以上是关于Protocol buffers 介绍的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中处理 Protocol Buffers 数据

从Protocol Buffers 到 gRPC

Google Protocol Buffer 协议

在NodeJS中玩转Protocol Buffer

怎样把json转为protocol buffer

Protocol Buffer技术详解(语言规范)