ProtoBuf 作为一种跨平台、语言无关、可扩展的序列化结构数据的方法,已广泛应用于网络数据交换及存储。

1. Proto定义

1.1. 说明

required表示该字段必须定义;

optional表示该字段可定义可不定义;

repeated一般用来定义数组;

1.2. 示例

syntax = "proto2";
package apollo.localization;message Pose {required double x = 1;required double y = 2;required double z = 3;required double roll = 4;required double yaw = 5;required double pitch = 6;
}message Velocity {required double x = 1;required double y = 2;required double z = 3;
}message Localization {required double time = 1;optional double TIME2 = 2;required Pose pose = 3;required Velocity velocity = 4;repeated double covariance = 5;repeated double confidence = 6;
}

2. Proto使用

#include "localization.pb.h"apollo::Localization localization// get time
double time = localization.time();double time2 = localization.time2(); // 注意:定义的时候写的是大写// set translation
apollo::Pose *pose_ptr = localization.mutable_pose();
Eigen::Vector3d translation = state.pose.block<3, 1>(0, 3);
pose_ptr->set_x(translation.x());
pose_ptr->set_y(translation.y());
pose_ptr->set_z(translation.z());// set rotation
Eigen::Matrix3d rotation = state.pose.block<3, 3>(0, 0);
Eigen::Vector3d euler_angle = rotation.eulerAngles(2, 1, 0);
pose_ptr->set_roll(euler_angle.x());
pose_ptr->set_pitch(euler_angle.y());
pose_ptr->set_yaw(euler_angle.z());// set covariance
const double *p = state.pose_covariance.data();
for (int i = 0; i < 16; ++i) {localization.add_covariance(p[i]);
}// get covariance
for (int i = 0; i < 16; ++i) {double value = localization.covariance(i);
}// get translation
const apollo::Pose &pose = localization.pose();
double x = pose.x();
double y = pose.y();
double z = pose.z();

3. 编译Proto

使用可执行文件protoc利用proto文件生成pb.h和pb.cc文件

一般protoc安装在/usr/local/bin或者/usr/bin下面

如果protoc未安装,需要先添加protobuf的动态链接库路径到LD_LIBRARY_PATH才能使用protoc

命令使用

protoc --proto_path=IMPORT_PATH1  --proto_path=IMPORT_PATH2 --cpp_out=DST_DIR --java_out=DST_DIR --python_out=DST_DIR --go_out=DST_DIR --ruby_out=DST_DIR --objc_out=DST_DIR --csharp_out=DST_DIR path/to/file.proto

用如下命令查看各参数的意义

protoc --help

4. 序列化与反序列化

在网络编程进行数据传输时,数据都是以字节流进行传输。因此需要我们将定义的proto格式的数据,进行序列化,转化成一段字符串编码,以便在网络上传输或者做存储处理。在传输完成后,在进行反序列化,转换成proto格式的数据进行使用。

4.1. 序列化

序列化使用SerializeToString()函数。

std::string test;        // 序列化到string
data.SerializeToString(&test);    // 序列化操作/*
# test 为序列话后的字符串编码
# data 为定义的proto格式的数据
*/

4.2. 反序列化

反序列化使用ParseFromString()函数进行解析

data.ParseFromString(test)   # 将test反序列化到data​/*
# test 为需要反序列化的字符串编码
# data 反序列化后的proto格式的数据。  data需要提前用proto定义
​*/

参考文献

Google_Protobuf协议——protobuf代码中的通讯_zxng_work的博客-CSDN博客

C++使用Protobuf正反序列化_休息一下接着来的博客-CSDN博客

ProtoBuf使用笔记相关推荐

  1. Protobuf学习笔记

    Protobuf学习笔记 Posted by iamxhuon 2012/05/22 Leave a comment (0)Go to comments Protocol buffers是什么? 首先 ...

  2. skynet入门笔记

    入门观看博客笔记: 博客笔记: 第五篇 关于服务别名 别名注册与查询接口: 在skynet中,服务别名可以分为两种: 一种是本地别名,本地别名只能在当前skynet节点使用,本地别名必须使用. 开头, ...

  3. 【职业规划和代码库设计】

      主业规划:(工具集 和 代码库) 技术论坛和开源社区 学习网站 设计(素描.PS.UI) 专业英语 绩效考评与自我评价  https://www.unjs.com/fanwenwang/ziwop ...

  4. 冰冰学习笔记:简单了解protobuf

    欢迎各位大佬光临本文章!!! 还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正. 本系列文章为冰冰学习编程的学习笔记,如果对您也有帮助,还请各位大佬.帅哥.美女点点支 ...

  5. Go语学习笔记 - grpc server/client protobuf | 从零开始Go语言

    目录 创建Proto文件 生成proto文件对应的go文件 创建服务结构体 创建客户端测试 小结 学习笔记,写到哪是哪. 上一篇是写的redis操作来着,最近主要研究了一下grpc. 在玩grpc的过 ...

  6. protobufjs 命令执行_【原码笔记】-- protobuf.js 与 Long.js

    protobuf.js的结构和webpack的加载之后的结构很相似.这样的模块化组合是个不错的结构方式.1个是适应了不同的加载方式,2个模块直接很独立.webpack的功能更全一点.但如果自己封装js ...

  7. protobuf java_ProtoBuf for java使用笔记 | 学步园

    三.新建项目ProtobufDemo.包名:com.protobufdemo.protobuf. 四.把上面的jar包跟exe放到工程目录下.新建文件夹:proto.在其下新建文件:msg.proto ...

  8. C++|Java工作笔记-google protobuf基本使用

    目录 前言 protoc生成 Java相关 C++相关 前言 这里主要是生成序列号,在我所做的项目中,一般是把数据序列化后扔到消息总线上,消费者读取了,自行解析. 个人感觉这种方式比Json和XML都 ...

  9. Protobuf的C++使用笔记

    简介 在网络编程中, 数据高效传输离不开数据的序列化. 直接编码不易于扩展, 而xml的方式太过于笨重, json的方式速度有点慢, protobuf是一个合理的方式, 把数据序列成二进制, 然后反序 ...

最新文章

  1. [原]执行存储过程后返回影响的行数
  2. oracle修改表结构精度,常见问题--oracle10g修改表结构
  3. 当年只会C# 所以写C++就成这样了! log4cplus - log4net
  4. Python函数名的第一类对象及使用
  5. 20道JS原理题助你面试一臂之力!
  6. 高等数学下-赵立军-北京大学出版社-题解-练习9.2
  7. 关于Python的一切:2018年,你读这8本书就够了
  8. 深度学习(四十二)word2vec词向量学习笔记
  9. vue-router组件重用 路由切换时的问题
  10. 使用CultureInfo来显示中文星期
  11. 苹果5完美越狱_苹果越狱工具
  12. android逆向 网易,Android逆向——网易云音乐排行榜api(上)
  13. java咖啡馆_Java咖啡馆(11):Java插件技术
  14. 【Vmware的vmdk文件转img文件】
  15. QT实现打地鼠小游戏
  16. 第八十六章 Caché 函数大全 $ZDATETIMEH 函数
  17. 我们仨——快乐的湘军
  18. OpenCV_Viz——OpenCV中Viz的模块编译的无法解析的外部符号BUG
  19. Laravel第三方登录开发之实现QQ登录
  20. I2C driver编写指导二:编写i2c client driver指南

热门文章

  1. Node.js入门(含NVM、NPM、NVM的安装)
  2. 大白话讲解Promise(二)理解Promise规范
  3. Javascript内置对象新增接口列表
  4. 阿里云:国际化是云计算技术能力的照妖镜
  5. Mozilla开源了VR框架A-Frame
  6. Codeforces Round #104 (Div. 2) E DP(01背包模型) +组和+除法取模求逆元
  7. php file函数在内容与底层逻辑分离的应用
  8. CV01-语义分割笔记和两个模型VGG ResNet的笔记
  9. php dropdownlist,为何activitieDropdownlist的值始终无法获取到
  10. 机器学习编程语言_我应该选择哪种编程语言? 我应该专注于前端吗? 后端? 机器学习?...