[序列化协议] --- protobuf

简介: [序列化协议] --- protobuf

1. protobuf安装

// 下载 protoBuf:
$ git clone https://github.com/protocolbuffers/protobuf.git
//  安装依赖库
$ sudo apt-get install autoconf  automake  libtool curl make  g++  unzip libffi-dev -y
// 进入目录
$ cd protobuf/ 
// 自动生成configure配置文件:
$ ./autogen.sh 
// 配置环境:
$ ./configure
// 编译源代码(要有耐心!):
$ make 
// 安装
$ sudo make install
// 刷新共享库 (很重要的一步啊)
$ sudo ldconfig 
// 成功后需要使用命令测试
$ protoc -h 

安装完成之后,输入下面指令测试

2. protobuf使用demo

2.1 project.proto

//指定版本 使用protobuf3
syntax = "proto3";
message Account {
  //账号
  uint64 ID = 1;
  //名字
  string name = 2;
  //密码
  string password = 3;
}
  • message 表示一个消息体, 相当于一个类。
  • 每个message中都有对应的变量, 每个变量有个对应的编号, 每个message内不同变量的编号不能重复。
  • 新版本的protobuf没有了required, optional等说明关键字, 都默认为optional
    所以基本的语法规则跟C++类似。 只不过多了后面变量的编号。

生成代码

protoc --cpp_out=./ project.proto

protoc是工具名, 可以直接运行的命令。

–cpp_out是参数, 指定生成C++代码, =后面指定生成的目录。

project.proto是定义的文件。

一共会生成两个文件。 project.pb.h 和 project.pb.cc

2.2 main.cpp

#include <iostream>
#include <string>
#include "project.pb.h"
int main()
{
  Account account;
  account.set_id(1000);
  account.set_name("name");
  account.set_password("password");
  //序列化
  std::string s = account.SerializeAsString();
  if(s.size() == 0) {
    std::cout << "error in SerializeAsString" << std::endl;
  }
  Account nAccount;
    //反序列化
  if(nAccount.ParseFromString(s)) {
    std::cout << nAccount.id() << std::endl;
    std::cout << nAccount.name() << std::endl;
    std::cout << nAccount.password() << std::endl;
  } else {
    std::cout << "error in ParseFromString" << std::endl;
  }
  return 0;
}

编译

project.pb.cc也需要编译, 如果是工程中, 可以单独编译, 由于只有一个文件所以就放到一块编译了

g++ project.pb.cc demo.cpp -o test  `pkg-config --cflags --libs protobuf` -lpthread

输出:

如果使用这个编译指令:

g++ project.pb.cc demo.cpp -o test -lprotobuf -lpthread -std=c++11

会报undefined reference的错误。

参看链接:

https://zhuanlan.zhihu.com/p/160249058

https://blog.csdn.net/lcuwb/article/details/90705397

https://blog.csdn.net/qinjie6839000/article/details/53573629

相关文章
|
4月前
|
XML 存储 JSON
(十二)探索高性能通信与RPC框架基石:Json、ProtoBuf、Hessian序列化详解
如今这个分布式风靡的时代,网络通信技术,是每位技术人员必须掌握的技能,因为无论是哪种分布式技术,都离不开心跳、选举、节点感知、数据同步……等机制,而究其根本,这些技术的本质都是网络间的数据交互。正因如此,想要构建一个高性能的分布式组件/系统,不得不思考一个问题:怎么才能让数据传输的速度更快?
|
7月前
|
XML JSON 分布式计算
如何选择序列化协议:关键因素与场景分析
如何选择序列化协议:关键因素与场景分析
65 0
|
XML JSON JavaScript
【面试题精讲】常见序列化协议有哪些?
【面试题精讲】常见序列化协议有哪些?
|
7月前
|
存储 JSON 网络协议
【计算机网络】序列化,反序列化和初识协议
【计算机网络】序列化,反序列化和初识协议
|
7月前
|
JSON 数据格式 C++
[序列化协议] --- JSON
[序列化协议] --- JSON
77 0
|
7月前
|
XML 存储 API
[序列化协议] --- XML
[序列化协议] --- XML
79 0
|
7月前
|
XML JSON Linux
[序列化协议] --- 简介
[序列化协议] --- 简介
63 0
|
7月前
|
存储 JSON 编解码
IM通讯协议专题学习(十):初识 Thrift 序列化协议
本文将带你一起初步认识Thrift的序列化协议,包括Binary协议、Compact协议(类似于Protobuf)、JSON协议,希望能为你的通信协议格式选型带来参考。
155 1
|
7月前
protobuf 序列化和反序列化
protobuf 序列化和反序列化
40 0
|
7月前
|
存储 XML JSON
日常小知识点之序列化结构(protobuf使用及简单原理)
日常小知识点之序列化结构(protobuf使用及简单原理)
187 0