zoukankan      html  css  js  c++  java
  • google protobuf安装与使用

      google protobuf是一个灵活的、高效的用于序列化数据的协议。相比较XML和JSON格式,protobuf更小、更快、更便捷。google protobuf是跨语言的,并且自带了一个编译器(protoc),只需要用它进行编译,可以编译成Java、python、C++、C#、Go等代码,然后就可以直接使用,不需要再写其他代码,自带有解析的代码。更详细的介绍见: Protocol Buffers

    protobuf安装

    1、下载protobuf代码 /protobuf

    2、安装protobuf

      tar -xvf protobuf

      cd protobuf

      ./configure --prefix=/usr/local/protobuf

      make

      make check

      make install

    至此安装完成^_^,下面是配置:

    (1) vim /etc/profile,添加

      export PATH=$PATH:/usr/local/protobuf/bin/
      export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig/
      保存执行,source /etc/profile。同时在~/.profile中添加上面两行代码,否则会出现登录用户找不到protoc命令。
    (2) 配置动态链接库
      vim /etc/ld.so.conf,在文件中添加/usr/local/protobuf/lib(注意: 在新行处添加),然后执行命令: ldconfig

     .proto文件

      .proto文件是protobuf一个重要的文件,它定义了需要序列化数据的结构。使用protobuf的3个步骤是:

    1 在.proto文件中定义消息格式

    2 用protobuf编译器编译.proto文件

    3 用C++/Java等对应的protobuf API来写或者读消息

    程序示例(C++版)

      该程序示例的大致功能是,定义一个Persion结构体和存放Persion的AddressBook,然后一个写程序向一个文件写入该结构体信息,另一个程序从文件中读出该信息并打印到输出中。

    1 address.proto文件

    package tutorial;
    
    message Persion {
        required string name = 1;
        required int32 age = 2;
    }
    
    message AddressBook {
        repeated Persion persion = 1;
    }

      编译.proto文件,执行命令: protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/addressbook.proto,示例中执行命令protoc --cpp_out=/tmp addressbook.proto ,会在/tmp中生成文件addressbook.pb.h和addressbook.pb.cc。

    2 write.cpp文件,向文件中写入AddressBook信息,该文件是二进制的

     1 #include <iostream>
     2 #include <fstream>
     3 #include <string>
     4 #include "addressbook.pb.h"
     5 
     6 using namespace std;
     7 
     8 void PromptForAddress(tutorial::Persion *persion) {
     9     cout << "Enter persion name:" << endl;
    10     string name;
    11     cin >> name;
    12     persion->set_name(name);
    13 
    14     int age;
    15     cin >> age;
    16     persion->set_age(age);
    17 }
    18 
    19 int main(int argc, char **argv) {
    20     //GOOGLE_PROTOBUF_VERIFY_VERSION;
    21 
    22     if (argc != 2) {
    23         cerr << "Usage: " << argv[0] << " ADDRESS_BOOL_FILE" << endl;
    24         return -1;
    25     }
    26 
    27     tutorial::AddressBook address_book;
    28 
    29     {
    30         fstream input(argv[1], ios::in | ios::binary);
    31         if (!input) {
    32             cout << argv[1] << ": File not found. Creating a new file." << endl;
    33         }
    34         else if (!address_book.ParseFromIstream(&input)) {
    35             cerr << "Filed to parse address book." << endl;
    36             return -1;
    37         }
    38     }
    39 
    40     // Add an address
    41     PromptForAddress(address_book.add_persion());
    42 
    43     {
    44         fstream output(argv[1], ios::out | ios::trunc | ios::binary);
    45         if (!address_book.SerializeToOstream(&output)) {
    46             cerr << "Failed to write address book." << endl;
    47             return -1;
    48         }
    49     }
    50 
    51     // Optional: Delete all global objects allocated by libprotobuf.
    52     //google::protobuf::ShutdownProtobufLibrary();
    53 
    54     return 0;
    55 }

      编译write.cpp文件,g++ addressbook.pb.cc write.cpp -o write `pkg-config --cflags --libs protobuf` (注意,这里的`符号在键盘数字1键左边,也就是和~是同一个按键)。

    3 read.cpp文件,从文件中读出AddressBook信息并打印

     1 #include <iostream>
     2 #include <fstream>
     3 #include <string>
     4 #include "addressbook.pb.h"
     5 
     6 using namespace std;
     7 
     8 void ListPeople(const tutorial::AddressBook& address_book) {
     9     for (int i = 0; i < address_book.persion_size(); i++) {
    10         const tutorial::Persion& persion = address_book.persion(i);
    11 
    12         cout << persion.name() << " " << persion.age() << endl;
    13     }
    14 }
    15 
    16 int main(int argc, char **argv) {
    17     //GOOGLE_PROTOBUF_VERIFY_VERSION;
    18 
    19     if (argc != 2) {
    20         cerr << "Usage: " << argv[0] << " ADDRESS_BOOL_FILE" << endl;
    21         return -1;
    22     }
    23 
    24     tutorial::AddressBook address_book;
    25 
    26     {
    27         fstream input(argv[1], ios::in | ios::binary);
    28         if (!address_book.ParseFromIstream(&input)) {
    29             cerr << "Filed to parse address book." << endl;
    30             return -1;
    31         }
    32         input.close();
    33     }
    34 
    35     ListPeople(address_book);
    36 
    37     // Optional: Delete all global objects allocated by libprotobuf.
    38     //google::protobuf::ShutdownProtobufLibrary();
    39 
    40     return 0;
    41 }

       编译read.cpp文件,g++ addressbook.pb.cc read.cpp -o read `pkg-config --cflags --libs protobuf`

    4 执行程序

    参考

    1、Google protobuf的安装及使用

    2、Google 的开源技术protobuf 简介与例子

    3、linux下安装protobuf教程+示例(详细)

    4、Protobuffer和json深度对比

  • 相关阅读:
    ORACLE时间函数(SYSDATE)简析
    RestTemplate请求
    Java中ASM框架详解
    java进阶
    Java,Mysql-根据一个给定经纬度的点,进行附近500米地点查询–合理利用算法
    JAVA程序员必看的15本书-JAVA自学书籍推荐
    Linux curl命令详解
    Java 集合系列06之 Vector详细介绍(源码解析)和使用示例
    腾讯信鸽推送Android SDK快速指南
    信鸽推送.NET SDK 开源
  • 原文地址:https://www.cnblogs.com/luoxn28/p/5303517.html
Copyright © 2011-2022 走看看