《protobuf》入门

news2024/11/17 8:16:58

protobuf

  • 初始protobuf
  • 简单上手
    • 编写protobuf
    • 编译 .proto 文件
    • 编写测试文件 testPB.cc

初始protobuf

Protocol Buffers 是 Google 的一种语言无关、平台无关、可扩展的序列化结构数据的 方法,它可用于(数据) 通信协议、数据存储等。

Protocol Buffers 类比于 XML,是一种灵活,高效,自动化机制的结构数据序列化 方法,但是比 XML 更小、更快、更为简单。

你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序

ProtoBuf(全称为 Protocol Buffer )是让结构数据序列化的方法,其具有以下 特点:

语言无关、平台无关:即 ProtoBuf支持Java、C++、Python多种语言,支持多个平台 。
高效:即比XML更小、更快、更为简单。
扩展性 、兼容性好:你可以更新数据结构,而不影响和破坏原有的旧程序

❓什么是序列化

在这里插入图片描述

简单上手

编写protobuf

  • 编写.proto文件
// 规定使用proto3语法标准,一定得在首行
syntax="proto3";
// 类似C++中的namespace,package是⼀个可选的声明符,能表示.proto⽂件的命名空间,在项⽬中要有唯⼀性。它的作⽤是为了避免我们定义的消息出现冲突
package=contacts;

// 消息类型命名规范:使⽤驼峰命名法,首字母大写
// message 消息体名称{}
message PeopleInfo
{
	string name = 1;
	int32 age = 2;
}

在 message 中,我们可以定义其属性字段,字段定义格式为: 字段类型 字段名 = 字段唯⼀编号

  • 字段名称命名规范:全小写字母,多个字母之间用 _ 连接。

  • 字段类型分为:标量数据类型特殊类型(包括枚举、其他消息类型等)。

  • 字段唯⼀编号:用来标识字段,一旦开始使用就不能够再改变。

字段唯⼀编号的范围
1 ~ 536,870,911(229-1),其中19000 ~ 19999不可用,做完保留字段

以下表格展示了标量数据类型,以及编译 .proto 文件之后自动生成的类中与之对应的字段类型。这里展示与C++语言对应的类型

TypeNotesC++ Type
doubledouble
floatfloat
int32使用变长编码[1]。负数的编码效率较低–若字段可能为负值,应使用 sint32 代替。int32
int64使用变长编码[1]。负数的编码效率较低–若字段可能为负值,应使用 sint64 代替。int64
uint32使用变长编码1uint32
uint64使用变长编码1uint64
sint32使用变长编码1。符号整型。负值的编码效率高于常规的 int32 类型。int32
sint64使用变长编码1。符号整型。负值的编码效率高于常规的 int64 类型。int64
fixed32定长 4 字节。若值常大于228则会比 uint32 更高效。uint32
fixed64定长 8 字节。若值常大于256 则会比 uint64 更高效。uint64
sfixed32定长 4 字节。int32
sfixed64定长 8 字节。int64
boolbool
string包含 UTF-8 和 ASCII 编码的字符串,长度不能超过 232string
bytes可包含任意的字节序列,长度不能超过 232string

编译 .proto 文件

在编写完 .proto 文件后,我们接着在终端对其进行编译

// 这里的.proto文件名称为 contacts
protoc --cpp_out=. contacts.proto

解释说明

protoc [--proto_path=IMPORT_PATH] --cpp_out=DST_DIR path/to/file.proto

在这里插入图片描述

cpp_out用来生成 C++ 代码,java_out产生 Java 代码,python_out产生 python 代码,类似地还有csharp_outobjc_outruby_outphp_out等参数。

在这里插入图片描述
成功编译如下
在这里插入图片描述

编写测试文件 testPB.cc

#include<iostream>
#include"contacts.pb.h"

int main()
{
	std::string people_str;
	{
		contacts::PeopleInfo people;
		people.setname("张三");
		people.setage("22");
		// 序列化后的内容是二进制,people_str只是载体,用于后面反序列化
		if(!people.SerializeToString(&people_str))  
		{
            std::cout<< "序列化失败!" << std::endl;
            return -1;
		}
        std::cout<< "序列化成功! 结果为:" << people_str << std::endl;
	}
	{
		contacts::PeopleInfo people;
		// 将people_str内容反序列化成原来的内容
		if(!people.ParseFromString(people_str))
		{
			std::cout<< "反序列化失败!" << std::endl;
            return -1;
		}
        std::cout<< "反序列化成功!" << std::endl;
        std::cout << people.name() << std::endl;
        std::cout << people.age() << std::endl;
	}
	return 0;
}
  • 编译,链接容易出现的坑
  1. 漏掉 -lprotobuf
  2. 漏掉 contacts.pb.cc

正确写法

g++ -o testPB testPB.cc contacts.pb.cc -lprotobuf -std=c++11

在这里插入图片描述


  1. 变长编码:经过protobuf 编码后,原本4字节或8字节的数可能会被变为其他字节数 ↩︎ ↩︎ ↩︎ ↩︎

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蚂蚁集团正式开源万亿规模图学习系统AGL

9月7日下午&#xff0c;上海外滩大会“融合机器学习与运筹优化”论坛上&#xff0c;蚂蚁集团正式开源图学习系统Ant Graph Learning &#xff08;AGL&#xff09;&#xff0c;这是行业首个通用的工业图学习系统。 图片说明&#xff1a;论坛上&#xff0c;蚂蚁集团正式开源了图学…

【Git】01-Git基础

文章目录 Git基础1. 简述1.1 版本管理演变1.2 Git的特点 2. Git安装2.1 安装文档2.1 配置user信息 3. 创建仓库3.1 场景3.2 暂存区和工作区 4. 重命名5. 常用git log版本历史5.1 查看当前分支日志5.2 简洁查看日志5.3 查看最近指定条数的日志 6. 通过图形界面工具查看版本7. 探…

docker-compose安装Nacos2

文章目录 一. Mac1.1 数据库nacos_dev1.2 docker-compose.yaml1.3 部署1.4 卸载1.5 查看 一. Mac 1.1 数据库nacos_dev sql文件地址 /** Copyright 1999-2018 Alibaba Group Holding Ltd.** Licensed under the Apache License, Version 2.0 (the "License");* yo…

Android常用的工具“小插件”——Widget机制

Widget俗称“小插件”&#xff0c;是Android系统中一个很常用的工具。比如我们可以在Launcher中添加一个音乐播放器的Widget。 在Launcher上可以添加插件&#xff0c;那么是不是说只有Launcher才具备这个功能呢&#xff1f; Android系统并没有具体规定谁才能充当“Widget容器…

一文巩固Spring MVC的Bean加载机制

目录 一、什么是Spring MVC的Bean 二、Spring MVC的Bean加载机制 三、Spring MVC如何动态装载Bean 一、什么是Spring MVC的Bean 在Spring MVC中&#xff0c;Bean指的是在Spring IoC容器中创建和管理的对象。这些对象可以是普通的Java类&#xff0c;也可以是服务层组件、数据…

微信“刷掌支付”上线!出门带手就可以了~

从2023年9月5日起&#xff0c;微信支付联合广东7-Eleven便利店正式发布了刷掌支付服务。用户可以在收银台结账时选择刷掌支付作为支付方式。这是全国首批支持微信刷掌支付的便利店&#xff0c;也是刷掌支付在广州地区的首次社会面应用。 目前&#xff0c;广东地区已经有超过150…

2023全国大学生数学建模竞赛C题思路模型代码来啦

目录 一.选题建议先发布&#xff0c;思路模型代码论文第一时间更新&#xff0c;获取见文末名片 二.选题建议&#xff0c;后续思路代码论文 C 题 蔬菜类商品的自动定价与补货决策 各题分析 获取完整思路代码见此处名片 一.选题建议先发布&#xff0c;思路模型代码论文第一时…

Redis简易入门15招

Redis简易入门15招 1、Redis简介 REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo写的key-value存储系统 。Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。…

SpringBoot 整合MyBatisPlus

简介 MyBatis Plus&#xff08;也称为MyBatis&#xff09;是MyBatis框架的增强版本&#xff0c;MyBatis是一种流行的轻量级Java持久化框架。MyBatis Plus提供了额外的功能&#xff0c;并简化了对MyBatis的使用&#xff0c;使得在Java应用程序中使用数据库更加便捷。 官方文档&a…

Grpc自定义类型(含Decimal)

官方文档&#xff1a;https://learn.microsoft.com/zh-cn/dotnet/architecture/grpc-for-wcf-developers/protobuf-data-types Proto文件目前所支持的数据类型有&#xff1a; 在官方文档中有提到&#xff0c;除以上数据类型外&#xff0c;还可以引用协议来指定“已知类型”扩…

UI设计师的发展前景是否超越了平面设计?

这是一个现代经济学的典型话题&#xff1a;应该跟随趋势追逐风口&#xff0c;还是坚守成熟的“夕阳产业” UI 设计行业发展短短不过 20 多年&#xff0c;但平面设计这个“夕阳产业”最早可以追溯到上世纪的二三十年代。显而易见的答案是&#xff0c;更新兴的 UI 设计师得到的好…

PaddleX:一站式、全流程、高效率的飞桨AI套件

随着ChatGPT引领的AI破圈&#xff0c;各行各业掀起了AI落地的潮流&#xff0c;从智能客服、智能写作、智能监控&#xff0c;到智能医疗、智能家居、智能金融、智能农业&#xff0c;谁能快速将AI与传统业务相结合&#xff0c;谁就将成为企业数字化和智能化变革的优胜者。然而&am…

Mybatis的关联关系映射以及自定义resultMap三种映射关系

目录 经典面试题&#xff1a; 一&#xff0c;关联关系映射 二&#xff0c;具体步骤&#xff1a; 总结 前言&#xff1a; 今天我们来学习Mybatis的关联关系映射以及自定义resultMap三种映射关系&#xff0c;希望这篇博客可以帮助大家的学习工作&#xff01;&#xff01;&…

1998-2014年工业企业数据库和绿色专利匹配

1998-2014年工业企业数据库绿色专利匹配 1、时间&#xff1a;1998-2014年 2、样本量&#xff1a;470万 3、来源&#xff1a;工业企业数据库、国家知识产权局、WIPO 4、指标&#xff1a; 企业匹配唯一标识码、组织机构代码、企业名称、年份、法定代表人、法定代表人职务、行…

JS-17--深拷贝跟浅拷贝的区别?如何实现一个深拷贝?

1、数据类型存储 JavaScript中存在两大数据类型&#xff1a; 基本类型 引用类型 基本类型数据保存在栈内存中 引用类型数据保存到堆内存中&#xff0c;引用数据类型的变量是一个指向堆内存中实际x对象的引用&#xff0c;存在栈中 2、浅拷贝 浅拷贝指的是创建新的数据&#xff…

基于SSM的小型企业办公自动化系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

第二证券:为什么a股放开做空机制?

对于很多一般出资者来说&#xff0c;做空股票是一件十分复杂和困难的工作&#xff0c;可是对于专业的出资者和组织来说&#xff0c;这供给了一个愈加自由的商场买卖环境。那么&#xff0c;为什么A股放开做空机制呢&#xff1f;我们从多个视点来分析&#xff1a; 视点一&#x…

谷歌seo技术流

很多外贸企业和独立站都想从Google获得免费的流量&#xff0c;也就是SEO流量&#xff0c;但是在做SEO的过程中&#xff0c;总会面临这样或那样的问题。米贸搜谷歌推广将这些问题总结如下&#xff1a; 既然SEO看起来似乎很难&#xff0c;但还是有很多电商公司愿意投资SEO&#x…

Nosql数据库服务之redis

Nosql数据库服务之redis 一图详解DB的分支产品 Nosql数据库介绍 是一种非关系型数据库服务&#xff0c;它能解决常规数据库的并发能力&#xff0c;比如传统的数据库的IO与性能的瓶颈&#xff0c;同样它是关系型数据库的一个补充&#xff0c;有着比较好的高效率与高性能。 专…

CSAPP的Lab学习——Archlab(Architecture Lab)

文章目录 前言一、A部分sum .ys&#xff1a;迭代求和链表元素写一个Y86-64的程序和。rsum .递归求和链表元素copy.ys 复制将源块复制到目标块 二、B部分三、C部分实现iaddq指令 总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招。刚刚看完CSAPP&#xff0c;真是一本神…