Protobuf

2020-03-24  本文已影响0人  臻甄

github:https://github.com/protocolbuffers/protobuf
官方指南:https://developers.google.com/protocol-buffers/docs/overview

中文指南:

Overview (是什么)

Install

github库 下载源码并编译。Ubuntu安装比较方便。

wget https://github.com/google/protobuf/releases/download/v2.4.1/protobuf-2.4.1.tar.gz
tar -xzf protobuf-2.4.1.tar.gz 
cd protobuf-2.4.1 
./configure
make 
make check # 这一步会报错,忽略即可,也可以跳过这一步
make install

安装完成后会在 /usr/local/bin 目录下生成一个可执行文件 protoc

ls /usr/local/bin/protoc
protoc --version  # 检查是否安装成功

在Ubuntu下一般会报错,protoc: error while loading shared libraries: libprotoc.so.8: cannot open shared,原因是 protobuf 的默认安装路径是/usr/local/lib,而/usr/local/lib 不在Ubuntu体系默认的 LD_LIBRARY_PATH里,所以就找不到该lib,解决方案:添加路径即可。

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

QuickStart

参考

Step 1. demo简介

Step 2. 定义.proto文件

package lm;  // package名字
message helloworld   // 消息名称,该消息含有3个成员
{ 
   required int32     id = 1;  // ID 
   required string    str = 2;  // str 
   optional int32     opt = 3;  //optional field, 可选成员,即消息中可以不包含该成员
}

Proto文件的命名规则packageName.MessageName.proto

Step 3. 编译.proto文件

// SRC_DIR:放置.proto的目录
// DST_DIR:输出.cc和.h文件的目录
protoc -I=$SRC_DIR --cpp_out=$DST_DIR

Step 4. 编写Writer 和 Reader

#include "lm.helloworld.pb.h"
int main(void) { 
  lm::helloworld msg1; 
  msg1.set_id(101);   // 设置 id 的值
  msg1.set_str(“hello”); 
     
  // Write the new address book back to disk. 
  fstream output("./log", ios::out | ios::trunc | ios::binary); 

  // SerializeToOstream 将对象序列化后写入一个 fstream 流
  if (!msg1.SerializeToOstream(&output)) { 
      cerr << "Failed to write msg." << endl; 
      return -1; 
  }         
  return 0; 
}
#include "lm.helloworld.pb.h" 
void ListMsg(const lm::helloworld & msg) { 
  cout << msg.id() << endl; 
  cout << msg.str() << endl; 
 } 
  
 int main(int argc, char* argv[]) { 
  // 声明类 helloworld 的对象 msg1
  lm::helloworld msg1; 
  { 
    fstream input("./log", ios::in | ios::binary); 
    // 利用 ParseFromIstream 从一个 fstream 流中读取信息并反序列化
    if (!msg1.ParseFromIstream(&input)) {
      cerr << "Failed to parse address book." << endl; 
      return -1; 
    } 
  } 
  // ListMsg 中采用 get 方法读取消息的内部信息
  ListMsg(msg1); 
}
>writer 
>reader 
101 
Hello

竞品对比


推荐阅读:Protobuf更多高级应用和细节

上一篇下一篇

猜你喜欢

热点阅读