protobuf配置与使用

Protobuf配置与安装

1 安装与配置

           1、protobuf是google公司提出的数据存储格式,详细介绍可以参考:https://code.google.com/p/protobuf/

           2、下载最新的protobuf,下载地址:https://code.google.com/p/protobuf/downloads/list

           3、下载protobuf2.5.o版本,protobuf-2.5.0.tar.gz解压并进行安装。

   解压:tar xvf protobuf-2.5.0.tar.gz

   安装步骤:(1)./configure (2)make (3)make check (4)make install

注意:安装成功后,将它的bin和lib目录分别加入到PATH和LD_LIBRARY_PATH环境变量,以方便直接调用。

通常建议安装到/usr/local目录下,执行configure时,指定--prefix=/usr/local/protobuf即可

设置环境变量过程:编辑/etc/profile,在文件末尾添加:

       export PATH=$PATH:/usr/local/protobuf/bin

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

2 简单实例

         2.1 编写example.proto

        clip_image001

          2.2 生成pb.h 和pb.c

         protoc  -I=src_dir  --cpp_out=dst_dir  $src_dir/addressbook.proto 

                    生成example.pb.h 和example.pb.cc

                   clip_image002

          2.3 使用protobuf

                 2.3.1 编写Write.cpp

                  clip_image004

          注:

                 ptest::person 的定义在example.proto 生成的example.pb.h 文件中进行声明,SerializeToOstream将对象序列化后写入fstream流。

               2.3.2 编译write.cpp

               clip_image006     

        注:

           -I /usr/local/include –L /usr/local/lib 分别为编译安装protobuf对应文件位置(cygwin对应目录位置),CentOs中编译安装protobuf后对应的文件位置        为:/usr/local/protobuf/include 和 /usr/local/protobuf/lib

              2.3.3 编写reader.cpp

                reader.cpp文件如下:

                clip_image007

            注:

                  1、ParseFromIstream从fstream中读取文件并反序列化。

                  2、编译reader.cpp:

                     clip_image009

  3 数据类型

         3.1 消息定义

          Protobuf消息定义:

          消息由至少一个字段组合而成,类似于C语言中的结构。每个字段都有一定的格式。

          字段格式:限定修饰符① | 数据类型② | 字段名称③ | = | 字段编码值④ | [字段默认值⑤]

          限定修饰符包含 requiredoptional epeated

         1) required: 表示是一个必须字段,必须相对于发送方,在发送消息之前必须设置该字段的值,对于接收方,必须能够识别该字段的意思。发送之前没有设置required字段或者无法识别required字段都会引发编解码异常,导致消息被丢弃。

         2) optional:表示是一个可选字段,可选对于发送方,在发送消息时,可以有选择性的设置或者不设置该字段的值。对于接收方,如果能够识别可选字段就进行相应的处理,如果无法识别,则忽略该字段,消息中的其它字段正常处理。---因为optional字段的特性,很多接口在升级版本中都把后来添加的字段都统一的设置为optional字段,这样老的版本无需升级程序也可以正常的与新的软件进行通信,只不过新的字段无法识别而已,因为并不是每个节点都需要新的功能,因此可以做到按需升级和平滑过渡。

        3) repeated:表示该字段可以包含0~N个元素。其特性和optional一样,但是每一次可以包含多个值。可以看作是在传递一个数组的值。

      3.2 数据类型

          Protobuf定义了一套基本的数据类型,如下图所示:

          clip_image011

参考资料:

       http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ 

       http://www.cnblogs.com/Anker/archive/2013/07/24/3209764.html

原文地址:https://www.cnblogs.com/luosongchao/p/3969988.html