protobuf序列化原理、安装与应用

目录

protobuf序列化

 protobuf的原理

 protobuf 的安装

编译message文件

应用protobuf


protobuf序列化

        protobuf是一种比json和xml等序列化工具更加轻量和高效的结构化数据存储格式,性能比json和xml真的强很多,毕竟google出品。

        官网:https://developers.google.com/protocol-buffers/

 protobuf的原理

 protobuf 的安装

apt-get install autoconf automake libtool curl make g++ unzip
$ git clone https://github.com/google/protobuf.git 
$ cd protobuf 
$ git submodule update --init --recursive 
$ ./autogen.sh 
$ ./configure 
$ make 
$ make check 
$ sudo make install 
$ sudo ldconfig 

定义message

所有的message必须定义到一个文件中,且文件的后缀名为.proto。例如我们定义的bike.proto文件

syntax = "proto2";

package tutorial;

message mobile_request
{
    required string mobile = 1;
}

message mobile_response
{
    required int32 code   = 1;   //响应代号
    required int32 icode  = 2;   //验证码
    optional string data  = 3;   //失败原因
}


message login_request
{
    required string mobile  = 1;    // 手机号码
    required int32  icode   = 2;    // 验证码
}


message login_response
{
    required int32   code   = 1;    // 响应代号
    optional string  desc   = 2;    // 验证码
}

message recharge_request
{
    required string mobile  = 1;    // 手机号码
    required int32  amount  = 2;    // 充值金额
}


message recharge_response
{
    required int32   code   = 1;    // 响应代号
    optional string  desc   = 2;    // 验证码
    required int32  balance = 3;    // 最新的余额
}

message account_balance_request
{
    required string mobile = 1;
}

message account_balance_response
{
    required int32   code   = 1;    // 响应代号
    optional string  desc   = 2;    // 验证码
    required int32  balance = 3;
}

message list_account_records_request
{
    required string mobile = 1;
}

message list_account_records_response
{
    required int32   code   = 1;    // 响应代号
    optional string  desc   = 2;    // 验证码
    message account_record
    {
        required int32  type      = 1; // 0 : 骑行消费,  1 : 充值, 2 : 退款
        required int32  limit     = 2; // 消费或者充值金额
        required uint64 timestamp = 3; // 记录发生时的时间戳
    }

    repeated account_record records = 3;
}

message list_travel_records_request
{
    required string mobile = 1;
}

message list_travel_records_response
{
    required int32   code   = 1;    // 响应代号
    optional string  desc   = 2;    // 验证码
    message travel_record
    {
        required uint64 stm      = 1;   // start timestamp
        required uint32 duration = 2;   // 骑行时长
        required uint32 amount   = 3;   // 所耗金额
    }

    required double              mileage   = 3; // 里程
    required double              discharge = 4; // 排放
    required double              calorie   = 5; // 卡路里
    repeated travel_record       records   = 6;
}

编译message文件

编译语法:

protoc -I=$SRC_DIR --cpp_out=$DST_DIR  bike.proto

SRC_DIR 表示proto文件所在的目录,cpp_out指定了生成的代码的路径, bike.proto指proto文件名。

protoc -I=./ --cpp_out=./ bike.proto

这样在当前目录生成了bike.pb.cc和bike.pb.h两个文件。

编译生成的c++文件 

g++  -std=c++11   example.cc bike.pb.cc -lprotobuf

应用protobuf

把生成了protocol.pb.cc和protocol.pb.h加入到工程,那么接着就是调用一些API,完成序列化和反序列化。

API说明  : https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.message

  • Message 基本用法

范例1: example1.cc

#include "bike.pb.h"
#include <string>
#include <iostream>


using namespace std;
using namespace tutorial;


int main(void)
{
    std::string data;   //存储序列化的消息

    //客户端发送请求
    {
        mobile_request mr;
        mr.set_mobile("18684518289");

        mr.SerializeToString(&data);
        cout<<"序列化后的数据["<<data.length()<<"]: "<< data << endl;
        cout<<hex<<(int)*((char*)data.c_str())<<endl;
        cout<<hex<<(int)*((char*)data.c_str() + 1)<<endl;
        //客户端发送data  send(sockfd, data.c_str(), data.length());
    }
    //服务器端接受请求
    {
        //receive(sockfd, data, ...);
        mobile_request mr;
        mr.ParseFromString(data);
        cout<<"客户端手机号码: " << mr.mobile() << endl;

    }

    return 0;
}
  • Message 嵌套使用

范例2: example1.cc

#include "bike.pb.h"
#include <string>
#include <iostream>

using namespace std;
using namespace tutorial;


int main(void)
{
    std::string data;   //存储序列化的消息

    //客户端发送请求
    {
        list_account_records_response larr;
        larr.set_code(200);
        larr.set_desc("ok");

        for(int i=0; i<5; i++)
        {
            list_account_records_response_account_record * ar = larr.add_records();
            ar->set_type(0);
            ar->set_limit(i * 100);
            ar->set_timestamp(time(NULL));
        }

        printf("recoreds size : %d\n", larr.records_size());
        larr.SerializeToString(&data);
        //客户端发送data  send(sockfd, data.c_str(), data.length());
    }
    //服务器端接受请求
    {
        list_account_records_response larr;
        larr.ParseFromString(data);

        printf("recoreds size : %d\n", larr.records_size());
        printf("code: %d\n", larr.code());
        for(int i=0; i<larr.records_size(); i++)
        {
            const list_account_records_response_account_record &ar = larr.records(i);
            printf("limit: %d\n", ar.limit());
        }
        //cout<<"客户端手机号码: " << mr.mobile() << endl;
    }

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/13245.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第八章 法律关系

目录 第一节 法律关系的概念 一、法律关系的定义与特征 二、法律关系的种类 &#xff08;一&#xff09;纵向&#xff08;隶属&#xff09;的法律关系和横向&#xff08;平权&#xff09;的法律关系 &#xff08;二&#xff09;单向&#xff08;单务&#xff09;法律关系、双…

Dear ImGui结合CMake实现基于GLFW和OpenGL3的入门级hello world代码

Dear ImGui结合CMake实现基于GLFW和OpenGL3的入门级hello world代码 如需转载请标明出处&#xff1a;https://blog.csdn.net/itas109 技术交流&#xff1a;129518033 环境&#xff1a; OS: windows 10 / Ubuntu 22.04 imgui: 1.89.5 glw: 3.3.8前言 Dear ImGui 是一个 用于…

outlook邮箱pc/mac客户端下载 含最新版

新的 Outlook for Windows or mac 为 Outlook 应用带来了最新功能、智能辅助功能和新的新式简化设计。 你可以根据自己的风格定制它&#xff0c;并使用新的 Outlook for Windows/mac 执行更多操作&#xff01; 览版&#xff0c;与我们一起开始旅程&#xff0c;并帮助我们塑造新…

leetcode142. 环形链表 II

给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数…

python 打包新方案

首先是打包一个最简单的python 代码使用 pyinstaller import os #直接读取文件获得python.exe 路径 # 待执行python路径 with open("path_run.txt","r",encoding"utf-8") as f:python_exe,pyf.readlines() os.system("{} {}".format(p…

什么牌子的蓝牙耳机音质最好?盘点2023音质最好的蓝牙耳机

近几年&#xff0c;蓝牙耳机在日常生活中的出现频率越来越高&#xff0c;不管是运动、听歌、追剧、玩游戏等等都能看到蓝牙耳机的身影。接下来&#xff0c;我来给大家盘点几款音质好的蓝牙耳机&#xff0c;感兴趣的朋友可以了解一下。 一、南卡小音舱Lite2蓝牙耳机 参考价&…

服务器版本的表白墙

目录 1.步骤 2.提供两个接口: 3.流程 4.代码 1.前端代码 2.sql创建表 3.后端代码 MessageServlet.java DBUtil.java 1.步骤 1.约定前后端交互的接口 2.开发服务器代码 a.编写servlet处理前端发来的请求 b.编写数据库代码,存储获取关键的数据 3.开发客户端代码 a.基于…

zabbix搭建

1.环境 本实验使用一台centos7主机&#xff0c;关闭了firewalld和selinux服务&#xff0c;zabbix版本为5.0版本&#xff0c;mysql使用版本为5.7版本 若要搭建6.0以上版本的zabbix&#xff0c;则需要使用mysql 8.0以上的版本 其它版本的zabbix可参考zabbix官网:Download and…

shell编程入门 第一章 基本语法

shell编程的语法主要分为五个环节&#xff0c;分别是变量&#xff0c;字符串&#xff0c;运算符&#xff0c;流程控制&#xff0c;函数五大部分 shell编程的基础语法 一 变量1.1 shell变量名1.2 使用shell变量1.3只读变量1.4 删除变量 二 字符串2.1 定义时最好用双引号2.2获取字…

Maven打包跳过测试的5种方式

Maven打包跳过测试的5种方式 1、命令行方式跳过测试 我们可以通过使用命令将项目打包&#xff0c;添加跳过测试的命令就可以了&#xff0c;可以用两种命令来跳过测试&#xff1a; -DskipTeststrue mvn package -DskipTeststrue-DskipTeststrue&#xff0c;不执行测试用例&a…

斩获“双金”!玻色量子在中国移动第七届创客马拉松大赛脱颖而出

​4月7日&#xff0c;中国移动第七届创客马拉松大赛总决赛在厦门圆满落幕。此次大赛以“能力无界 智算同行”为主题&#xff0c;经过近4000个创新项目的层层选拔&#xff0c;玻色量子凭借“相干量子计算设备”项目脱颖而出&#xff0c;成功摘取“双金”&#xff1a;总决赛全球通…

HttpServletRequest的介绍和方法以及代码实战

目录 HttpServletRequest HttpServletRequest 介绍 HttpServletRequest 常用方法 代码实战 HTML部分 Java部分 web.xml配置 请求转发 为什么需要请求转发 请求转发说明 请求转发原理示意图 代码实战 HTML部分 CheckServlet部分 ManageServlet 部分 xml部分 请求…

搭建静态网页

day3作业 请给openlab搭建web网站​ 网站需求&#xff1a;​ 1.基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!!​ 2.给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料和缴费网站&#xff0c;基于[www.openlab.com…

DHCP原理与配置

目录 一、DHCP工作原理 1&#xff09;了解DHCP服务 使用DHCP的好处 DHCP的分配方式 2&#xff09;DHCP的租约过程 分为四个步骤 二、DHCP服务器的配置 1&#xff09;检查并且安装dhcp有关软件包 2&#xff09;查看系统的配置文件&#xff0c;并且利用好官方给的参考案…

idea 配置docker 进行上传镜像,部署启动容器

前言 在我们开发测试过程中&#xff0c;需要频繁的更新docker镜像&#xff0c;然而默认情况下&#xff0c;docker的2375端口是关闭的&#xff0c;下面介绍如何打开端口。 修改docker配置文件 操作步骤&#xff1a; 1.1、修改配置 登录docker所在服务器&#xff0c;修改docker…

银行数字化转型导师坚鹏:银行数字化创新应用与案例分析

银行数字化创新应用与案例分析 课程背景&#xff1a; 很多银行存在以下问题&#xff1a; 不知道如何进行数字化创新&#xff1f; 不知道金融科技在银行业的重要应用&#xff1f; 不清楚银行同业的数字化创新有哪些案例&#xff1f; 课程特色&#xff1a; 用独特视角…

读 AI学者生存策略

链接&#xff1a;https://arxiv.org/pdf/2304.06035.pdf 作者&#xff1a;Julian Togelius and Georgios N. Yannakakis 随着大模型 和 大数据的出现&#xff0c; AI研究者 都会感到焦虑。 没有计算资源 &#xff0c;没有标注的人力&#xff0c;很难做出突破性的研究。即使很多…

百度发布Apollo城市智驾,距离AI智能驾驶还有多远?

推荐&#xff1a;将NSDT场景编辑器加入你的3D工具链。 工具集&#xff1a;NSDT简石数字孪生 随着人工智能技术的不断发展&#xff0c;智能驾驶已经成为了汽车行业的一个重要领域。智能驾驶可以减少人为驾驶的错误和疲劳驾驶等不安全因素&#xff0c;提高驾驶安全性&#xff0c…

【python中的多进程了解一下?】

基本说明 多进程是指在同一台计算机中同时运行多个独立的进程。每个进程都有自己的地址空间&#xff0c;可用于执行一些特定的任务。这些进程可以同时执行&#xff0c;从而提高了程序的性能和效率。多进程可以在多核计算机上实现真正的并行计算&#xff0c;可以同时运行多个程…

工程行业管理系统-专业的工程管理软件-提供一站式服务

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…
最新文章