分享

Windows下VC++使用protobuf

 mscdj 2017-10-17

Protocol Buffers(protobuf)是Google提供的一个开源序列化框架,类似XML,JSON,其最大的特点是基于二进制,比传统的XML表示同样一段内容要短小得多。虽然是二进制数据格式,但并没有因此变得复杂,开发人员通过按照一定的语法定义结构化的消息格式,然后送给命令行工具,工具将自动生成相关的类,可以支持c++、java、python等语言环境。通过将这些类包含在项目中,可以很轻松的调用相关方法来完成业务消息的序列化与反序列化工作。

下面将说明如何在windows下VC++使用protobuf

一、前期准备

1、下载protobuf源代码,有两种方式选择:

源代码包地址:https://protobuf./files/protobuf-2.5.0.zip

svn地址:http://protobuf./svn/trunk/

二、编译protobuf

1、进入vsprojects目录,执行extract_includes.bat 提取项目头文件

这时候当前目录会生成include目录

2、打开项目文件protobuf.sln,编译libprotobuf 和 protoc

这时候编译目录会生成libprotobuf.lib和protoc.exe

注意了,debug编译后的文件用于debug项目,release编译后的文件用于release项目,否则会出错。

  1. /********  无情的分割线 ********* /    
  2.   作者:没有开花的树    
  3.   博客:blog.csdn.net/mycwq    
  4. / *******   无情的copy  *********/     

三、在项目中使用protobuf

1、新建一个win32 控制台应用程序,命名为pbtest

2、把上面的include目录、libprotobuf.lib和protoc.exe放到工程目录下

3、写一个proto文件,保存为person.proto,代码如下:

[plain] view plain copy
  1. message Person {  
  2.   required int32 id = 1;  
  3.   required string name = 2;  
  4.   optional string email = 3;  
  5. }  
4、写一个批处理文件,保存为build.bat,代码如下:

[plain] view plain copy
  1. protoc --cpp_out=./ person.proto  
5、运行批处理build.bat,生成proto协议文件person.pb.h和person.pb.cc,加到项目中

6、修改项目属性VC++ 目录包含目录添加“include”

7、修改pbtest.cpp文件,代码如下:

  1. #include <iostream>  
  2. #include <fstream>  
  3. #include <string>  
  4. #include "person.pb.h"  
  5.   
  6. using namespace std;  
  7.   
  8. #pragma comment(lib, "libprotobuf.lib")  
  9.   
  10. int main(int argc, char* argv[])  
  11. {  
  12.     //校验协议版本  
  13.     GOOGLE_PROTOBUF_VERIFY_VERSION;  
  14.   
  15.     Person person;  
  16.   
  17.     //将数据写到person.pb文件  
  18.     person.set_id(123);  
  19.     person.set_name("Bob");  
  20.     person.set_email("bob@example.com");  
  21.   
  22.     fstream out("person.pb", ios::out | ios::binary | ios::trunc);  
  23.     person.SerializeToOstream(&out);  
  24.     out.close();  
  25.   
  26.   
  27.     //从person.pb文件读取数据  
  28.     fstream in("person.pb", ios::in | ios::binary);  
  29.     if (!person.ParseFromIstream(&in)) {  
  30.         cerr << "Failed to parse person.pb." << endl;  
  31.         exit(1);  
  32.     }  
  33.   
  34.     cout << "ID: " << person.id() << endl;  
  35.     cout << "name: " << person.name() << endl;  
  36.     if (person.has_email()) {  
  37.         cout << "e-mail: " << person.email() << endl;  
  38.     }  
  39.   
  40.     getchar();  
  41.     return 0;  
  42. }  
8、编译项目,效果如下:



demo下载:http://download.csdn.net/detail/cwqcwk1/6810611

参考:

http://blog.csdn.net/mycwq/article/details/17606527


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多