zoukankan      html  css  js  c++  java
  • 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对象,读取其中定义的数据值。

  • 相关阅读:
    PAT (Advanced Level) 1010. Radix (25)
    PAT (Advanced Level) 1009. Product of Polynomials (25)
    PAT (Advanced Level) 1008. Elevator (20)
    PAT (Advanced Level) 1007. Maximum Subsequence Sum (25)
    PAT (Advanced Level) 1006. Sign In and Sign Out (25)
    PAT (Advanced Level) 1005. Spell It Right (20)
    PAT (Advanced Level) 1004. Counting Leaves (30)
    PAT (Advanced Level) 1001. A+B Format (20)
    PAT (Advanced Level) 1002. A+B for Polynomials (25)
    PAT (Advanced Level) 1003. Emergency (25)
  • 原文地址:https://www.cnblogs.com/spplus/p/5415563.html
Copyright © 2011-2022 走看看