• google protocol buffer 使用说明


    一:编译源码

    下载地址:http://code.google.com/p/protobuf/downloads/list   

    下载后,根据编译说明进行编译。

    windows 平台,直接打开msvc中的工程文件,直接编译。

    unix/linux平台,先进行configure,在make

    生成的结果中有库文件有:

    libprotobuf.lib

    可执行文件有:

    protoc.exe

    头文件:

    根据提供的extract_includes.bat文件,提取公共头文件。

    二:编写proto文件

    根据需要,编写proto文件。

    三:生成头文件

    编写完proto文件后,接下来,用proto.exe生成.h.cc文件。

    命令如下:

     protoc.exe -proto_path=SRC --cpp_out=DST SRC/addressbook.proto 

         其中--proto_path指出proto文件所在的目录,--cpp_out则是生成的代码文件要放的目录,最后的一个参数指出proto文件的路径。如上述命令中可以看出,将SRC目录下的addressbook.proto编译后放在DST目录下,应该会生成addressbook.pb.haddressbook.pb.cc文件

     

    四:与工程进行集成

    需要把生成的.h.cc导入到工程中去,在需要用到数据解析的文件中,引用该.h文件。

    需要把libprotobuf.lib添加到项目的依赖库中。

    五:推荐做法:

    建立文件夹pbbuff,在其中创建3个子文件夹:bin,lib,include,其中:

    bin 存放proto.exe文件 

    lib 存放libprotobuf.lib 文件

    include 存放公共头文件

    创建环境变量PBROOT,指向pbbuff文件。把%PBROOT%/bin添加到系统的环境变量PATH中,以便能识别proto命令。

    六:引用共用结构定义

    6.1 结构定义

    在目前common/pubffer目录创建com文件夹,放置共用的buffer结构定义。如定义公共buffer文件为rms.common.proto文件其中定义的共用message类型

    message CrdInfo

     { 

        optional bytes crdid  = 1;

        optional bytes crdcode= 2;  

    }

    在其他文件需要文件中引用该buffer结构,如:

    // 文件开头导入要引用的公共buffer文件

    import "rms.common.proto";

    message CrdFistAudit

     { 

    repeated CrdInfo crdinfo = 1;

        optional bytes CreateUser  = 2;

        optional bytes CreateDate= 3;  

    }

    6.2 文件生成

    公共buffer结构文件生成.cc.h文件和以前一样,照常生成。引用公共buffer文件的proto文件生成.cc.h文件时,需要指定引用公共buffer文件的路径,在protoc命令后面添加--proto_path选项,值为引用的文件所在的目录。如下面用到的共用buffer所在的目录为:E:projectpbtestcom

     

    6.3 结构使用

    6.3.1 赋值

    如使用上面定义的结构CrdFistAudit为例,我们使用的方式一般如下,会声明一个保存CrdFistAudit列表的buffer结构如:

    message LCrdFistAudit

     { 

    repeated  CrdFistAudi  crdinfo = 1;

    }

    在后台从数据库取值填buffer时如下:

    LCrdFistAudit auditList;

    // 向列表中插入一条记录

    CrdFistAudit* paudit = auditList.add_crdfistaudit();

    填写改条记录的各字段值,普通字段的值照旧,下面只说明公共buffer结构的填写。

    // 声明一个公共buffer结构的指针

    CrdInfo* pcrd = paudit.add_crdinfo();

    然后用pcrd给公共的结构各字段赋值。

    6.3.2 取值

    取值时跟以前方式类似,只是在取公共buffer结构时有点不同,如:

    从列表中取出一条记录:

    LCrdFistAudit auditList;

    CrdFistAudit audit = auditList.crdfistaudit(i);  

    // 从该记录中取出公共buffer结构

    CrdInfo crdinfo = audit.crdinfo(0) // 注,由于在填值的时候只插入了一条记录,所有此处序号一直都是0

    取出公共buffer结构后,按字段取值照旧。

    6.3.3 网络传输 

    l 发送

    buff内容通过socket发送,只需要把buff内容序列化到string中,然后就可以得到内容的缓冲区,拷贝数据包的数据区就可以了:

    string fdata;

    PBNS::HpUpFileMsg_Request ureq; // buff对象

    // buff赋值,这块根据具体的buff而定

    PBNS::HpFileBean* file = ureq.add_upfile();

    // 这块是通用的,把填好内容的buff序列化到string

    ureq.SerializeToString(&fdata);

    然后就可以把string通过网络发送出去

    l 接收

    从网络接收到缓冲区msg,长度length 。反序列化过程如下:

    // buff对象根据具体协议,用不同的buff对象。

    PBNS::HpUpFileMsg_Request req ;

    // 把缓冲区内容序列号到buff对象

    req.ParseFromArray(msg,length);

    获得buff对象后,可以使用buff对象,读取其中定义的数据值。

  • 相关阅读:
    [leetcode] Combinations
    Binary Tree Level Order Traversal I II
    [leetcode] Remove Duplicates from Sorted Array I II
    [leetcode] Permutations II
    [leetcode] Permutations
    如何在线程间进行事件通知?
    如何实现迭代对象和迭代器对象?
    如何判断字符串a是否以字符串 b开头或者结尾?
    如何实现用户的历史记录功能(最多n条)?
    如何让字典保持有序?
  • 原文地址:https://www.cnblogs.com/spplus/p/5415563.html
Copyright © 2020-2023  润新知