Protobuf 了解

news2024/11/19 8:25:06

Protocol Buffers 是一种结构数据序列化方法,可以将C++中定义的存储类的内容与二进制序列串相互转换,主要用于数据传输或数据存储,可类比XML、JSON,而XML、JSON基于文本格式,protobuf是二进制格式,所以比XML、JSON更小(3~10倍)、更快(20 ~ 100倍),但是使用也相对复杂。

搭建Protobuf c++ vs工程

1  获取 protobuf库

   win下需自行编译,下载后编译。

Releases · protocolbuffers/protobuf · GitHub

 2  配置测试工程

上述编译成功后生成库目录,将依赖头文件、lib文件、dll文件配置到测试工程中

 

 工程配置如下:

常规\输出目录                      ..\..\build\$(PlatformToolset)\$(Platform)\$(Configuration)\

C/C++\常规\附加包含目录   ..\..\build\include

 链接器\常规\附加库目录     ..\..\build\$(PlatformToolset)\$(Platform)\lib

3   编写msgtest.proto文件

syntax="proto3";   //protobuf协议版本
package test;       //包名
message helloworld 

    int32 id = 1;       // 必选类型 
    string str = 2;     // str 
    int32 opt = 3;      //可选 
}

4  生成引用文件

执行上述编译好的protoc.exe,生成h与cpp文件

protoc.exe --cpp_out=. msgtest.proto

 

 5 应用

将生成的msgtest.pb.h与msgtest.pb.cc放入测试工程目录下,并添加到工程,写测试。

#include <iostream>
#include <fstream>
#include "msgtest.pb.h"

#pragma comment(lib,"libprotobuf.lib")
#pragma comment(lib,"libprotoc.lib")


void test_write()
{
	test::helloworld msg1;
	msg1.set_id(101);
	msg1.set_str("hello101");
	std::fstream output("./log", std::ios::out | std::ios::trunc | std::ios::binary);
	if (!msg1.SerializeToOstream(&output))
	{
		std::cerr << "Failed to write msg." << std::endl; return;
	}
}

void test_read()
{
	test::helloworld msg2;
	{
		std::fstream input("./log", std::ios::in | std::ios::binary);
		if (!msg2.ParseFromIstream(&input)) {
			std::cerr << "Failed to parse address book." << std::endl;
			return;
		}
	}
	std::cout << "id:"<< msg2.id() << std::endl;
	std::cout << "str:" << msg2.str() << std::endl;
}

int main()
{
	std::cout << "hello protobuf" << std::endl;
	test_write();
	test_read();
	getchar();
	return 0;
}

6 编译运行

编译错误:无法解析的外部符号 "class google::protobuf::internal::ExplicitlyConstructed<class std::basic_string<char,struct std::char_traits,class std::allocator > >

解决:在生成的msgtest.pb.h头文件中添加 #define PROTOBUF_USE_DLLS

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

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

相关文章

【论文阅读总结】inception v4与Inception-ResNet总结

Inception-v4, Inception-ResNet和Residual connections对学习的影响1.摘要2.引言3.文献综述4.体系结构的选择4.1 Pure Inception4.2 Residual Inception Blocks【残差Inception 块】4.3 Scaling of the Residuals【残差的缩放】4.3.1实验发现4.3.1.1实验发现14.3.1.2实验发现2…

ERP容灾备份维护工作有哪些?服务器容灾备份

ERP维护工作有哪些&#xff1f;这是公司信息化专员工作职责&#xff1a;信息规划  1、参与 公司信息化系统总体构架&#xff0c;建立健全公司信息化各项管理制度和标准业务流程&#xff0c;组织公司各业务部门不断进行业务流程的梳理、优化和创新&#xff0c;推动信息化的持续…

408 考研《操作系统》第三章第二节:内存管理、覆盖和交换 、连续分配管理方式、动态分区分配算法

文章目录1. 内存管理的概念1.1 内存保护1.2 总结2. 覆盖与交换2.1 覆盖技术2.2 交换技术2.3 总结&#xff1a;3. 连续分配管理方式3.1 单一连续分配3.2 固定分区分配3.3 动态分区分配3.4 总结4. 动态分区分配算法4.1 首次适应算法4.2 最佳适应算法4.3 最坏适应算法4.4 邻近适应…

米尔基于ARM架构核心板的国产化EtherCAT主站控制器解决方案

EtherCAT是由德国BECKHOFF自动化公司于2003年提出的实时工业以太网技术。它具有高速和高数据有效率的特点&#xff0c;支持多种设备连接拓扑结构。其从站节点使用专用的控制芯片&#xff0c;主站使用标准的以太网控制器。 EtherCAT是一种工业以太网技术&#xff0c;看到的大多…

【RocketMQ】RocketMQ实例--顺序消息

1、应用场景 一、以证券股票交易撮合场景为例&#xff0c;对于出价相同的交易单&#xff0c;坚持按照先出价先交易的原则&#xff0c;下游处理订单的系统需要严格按照出价顺序来处理订单。 二、以数据库变更增量同步场景为例&#xff0c;上游源端数据库按需执行增删改操作&…

RK3568烧录系统

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、烧录工具二、烧录步骤单独烧录烧录整个固件总结前言 前面我们已经学会了编译系统&#xff0c;包括一键编译和单独编译&#xff0c;其中单独编译适合我们做驱…

ENSP 路由器到本地(现实)PC的FTP实验

前言&#xff1a; 在一个风和日丽的下午&#xff0c;我同事突然问我ENSP和本地PC怎么上传和下载文件&#xff1f;我本以为这个很简单&#xff0c;然后我开始了面向百度编程&#xff0c;但是网上的大多数都是ENSP里面的路由器、服务器和PC间的FTP实验&#xff0c;而不是到本地&…

嵌入式经典通信总线协议:SPI协议

目录 一、spi简介 二、SPI特性 三、spi四种工作方式 四、实现代码 1.选择开发板 2.选择SPI 3.设置硬件片选使能和通讯方式&#xff0c;其他根据需要选择 4. 生成代码 一、spi简介 SPI 是英语Serial Peripheral interface的缩写&#xff0c;顾名思义就是串行外围设备接口…

GIT:如何删除仓库中的.idea .DS_Store target文件/文件夹并设置下次不上传

0. 引言 我们常常会有在git仓库初始化时&#xff0c;忘记设置.gitignore文件导致一些非工程文件上传到仓库中了&#xff0c;导致整个仓库的不美观&#xff0c;甚至影响其他开发同事配置代码。这时候我们就需要删除这些指定文件&#xff0c;那么如何操作呢&#xff0c;这一章我…

php学生成绩管理系统,在线录入、统计学生成绩,多种图表展示对比学生成绩

教学质量是学校教学的生命线&#xff0c;只有能够客观分析自己教学成败得失的教师才是一个合格的老师。这是一款注重优化成绩采集方法、丰富成绩分析维度的小学成绩统计系统&#xff0c;力争做到符合教师工作习惯、使用方法简单、数据分析多样、分析结果科学&#xff0c;为教师…

垃圾回收机制之v8引擎

v8的内存分配 &#xff08;栈&#xff08;执行环境&#xff09;跟堆&#xff09; 堆内存负责垃圾回收机制&#xff0c;只有新生代和老生代两部分 新生代&#xff1a;对等分的&#xff08;严格&#xff09; 老生代&#xff1a; 都是由新生代转变的&#xff08;连续的空间&…

Vue 实现 html 表格 (grid) 单元格编辑功能 2

第一版表格编辑实现是刚学VUE时硬凑出来 点击详见 经过网上的不断学习&#xff0c;代码精简功能增强&#xff0c;克服了上一个版本的两个bug。 欢迎没有下载积分的朋友欢迎复制转载。 主要功能&#xff1a; 由于取消了 vue 循环的 key 更新&#xff0c;故单元格不需要点击两…

Redis常见面试题(六)

目录 1、Redis支持的Java客户端有哪些? 2、Redisson是什么框架? 3、Redis和Redisson有什么关系? 4、Jedis和Redisson对比有什么优缺点? 5、Redis为什么不提供Windows版本? 6、Redis怎么在Windows下使用? 7、Redis如何设置密码访问? 8、Redis如何分析慢查询操作?…

前端线上问题如何调试

记录Vue开发过程中遇到的问题&#xff0c;测试环境以及本地显示都没有问题&#xff0c;但是一上线就出现问题&#xff0c;于是对于这个问题进行排查&#xff0c;在此记录排查问题的步骤以及方法&#xff0c;希望对大家有帮助。 错误信息&#xff1a;Uncaught TypeError: Canno…

Redis常见面试题(七)

目录 1、什么是缓存预热? 2、什么是缓存热备? 3、什么是缓存雪崩? 4、如何解决缓存雪崩? 5、什么是缓存穿透? 6、如何解决缓存穿透? 7、什么是缓存击穿? 8、如何解决缓存击穿? 9、什么是缓存抖动? 10、如何解决缓存抖动? 11、什么是缓存无底洞? 12、如何…

如何让一个 C 语言项目调用另一个 C++ 项目中某些类所提供的接口?

目前問題是這樣的&#xff1a;有兩個項目 一個項目是用 C 寫的 裏面提供了一個輸入輸出接口 後來從外面弄來了另外一個項目 用 C 寫的 現在需要將 C 項目中所使用的原有接口替換為使用我們的 C 項目中提供的接口 求問能夠實現否&#xff1f; 在项目开发过程中&#xff0c;我们底…

XGBoost总结

1.算法原理 XGBoost是boosting算法的其中一种。Boosting算法的思想是将许多弱分类器集成在一起形成一个强分类器。因为XGBoost是一种提升树模型&#xff0c;该算法思想就是不断地添加树&#xff0c;不断地进行特征分裂来生长一棵树&#xff0c;每次添加一个树&#xff0c;其实…

CSS3之3D转换

文章目录一、3D移动translate3d二、perspective&#xff08;透视&#xff09;三、translateZ四、rotateX-rotateY-rotateZ五、rotate3d(x,y,z,deg)六、3D呈现transfrom-style七、旋转木马案例一、3D移动translate3d 3D移动在2D移动的基础上多加了一个可以移动的方向&#xff0…

Python 函数用法和底层分析

【无限嚣张&#xff08;菜菜&#xff09;】&#xff1a;hello您好&#xff0c;我是菜菜&#xff0c;很高兴您能来访我的博客&#xff0c;我是一名爱好编程学习研究的菜菜&#xff0c;每天分享自己的学习&#xff0c;想法&#xff0c;博客来源与自己的学习项目以及编程中遇到问题…

Android编译ZLMediaKit之实现NVR功能问题点记录

NVR功能 NVR&#xff0c;全称Network Video Recorder&#xff0c;即网络视频录像机&#xff0c;是网络视频监控系统的存储转发部分&#xff0c;NVR与视频编码器或网络摄像机协同工作&#xff0c;完成视频的录像、存储及转发功能。 一、git clone项目 git clone --recursive …