ProtoBuf序列化框架介绍

文章目录

    • ProtoBuf介绍
      • 使用流程
    • QUICK START
      • 创建.proto文件
      • 注释
      • 语法
      • 编译
      • 部分代码展示
      • 使用接口
      • 运行结果

ProtoBuf介绍

ProtoBuf全称是Protocol Buffer,是一个数据结构的序列化和反序列化框架

他又很多好处,首先是他支持跨平台,支持Java、C++、Python等多种语言,还比XML更小更快更简单

除此之外还可以更新数据结构,不会破坏原有的结构

使用流程

请添加图片描述

这个框架的使用流程是这样的

我们需要编写的是.proto文件,来描述结构化的对象,和其中的成员,属性

这个文件可以使用protoc编译器来处理,处理的结果就是我们需要的对应的语言,用来结构化对象数据操作的代码

我们在业务代码中包含这些头文件,就能使用这些方法把我们要序列化或者反序列化的数据进行处理

QUICK START

这里我们通过一个简单的通讯录实现来快速上手protobuf

创建.proto文件

推荐的规范

  • 创建该文件,文件名必须用全小写命名,字母之间使用_连接
  • 2字符缩进

注释

与C/C++一样

//
/* */

语法

syntax = "proto3"; // 指定使用proto3版本语法package contacts; // 可选的声明符,表示文件的命名空间// 结构化对象
message contact{// 字段描述 : 字段类型 字段名 = 字段唯一编号;uint64 ID = 1;string Name = 2;string TelNumber = 3;string Adders = 4;
}

编译

生成cpp文件

protoc --cpp_out=. contacts.proto

.表示在当前目录生成

部分代码展示

class contact PROTOBUF_FINAL :public ::PROTOBUF_NAMESPACE_ID::Message  {void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final;void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final;friend void swap(contact& a, contact& b) {a.Swap(&b);}// string Name = 2;void clear_name();const std::string& name() const;void set_name(const std::string& value);void set_name(std::string&& value);void set_name(const char* value);void set_name(const char* value, size_t size);// string TelNumber = 3;void clear_telnumber();const std::string& telnumber() const;void set_telnumber(const std::string& value);void set_telnumber(std::string&& value);void set_telnumber(const char* value);void set_telnumber(const char* value, size_t size);// string Adders = 4;void clear_adders();const std::string& adders() const;void set_adders(const std::string& value);void set_adders(std::string&& value);void set_adders(const char* value);void set_adders(const char* value, size_t size);// uint64 ID = 1;void clear_id();void set_id(::PROTOBUF_NAMESPACE_ID::uint64 value);
};class PROTOBUF_EXPORT MessageLite {public:// 部分反序列化接口bool ParseFromString(const std::string& data);bool ParsePartialFromString(const std::string& data);bool ParseFromArray(const void* data, int size);bool ParsePartialFromArray(const void* data, int size);// 部分序列化接口std::string SerializeAsString() const;std::string SerializePartialAsString() const;bool SerializeToFileDescriptor(int file_descriptor) const;bool SerializePartialToFileDescriptor(int file_descriptor) const;
};

这里提供了一些访问和设置的接口,除此之外,这个类继承的是Message类,基类是提供了序列化的反序列化的接口的,我们使用这个框架的目的就正在于此

get的方法名称就是小写的字段名称,set的方法名称是以set_开头,后面续上小写字段名

使用接口

需要注意的是,protobuf序列化的结果是二进制数据,并非字符,因此直接打印或者读取文件也依然是无法读取的,这里我们只是做序列化的演示

#include "contacts.pb.h"
#include <string>int main()
{// 创建对象contacts::contact cont;// 初始化值cont.set_id(0001);cont.set_adders("翻斗大街翻斗花园2号楼1001室");cont.set_name("胡图图");cont.set_telnumber("13600000001");// 序列化std::string str = cont.SerializeAsString();// 数据传输// ......// 反序列化contacts::contact recv;bool res = recv.ParseFromString(str);if (res == false){std::cout << "反序列化失败" << std::endl;return -1;}// 使用std::cout << "ID: " << recv.id() << std::endl;std::cout << "Name: " << recv.name() << std::endl;std::cout << "Adders: " << recv.adders() << std::endl;std::cout << "TelNumber: " << recv.telnumber() << std::endl;return 0;
}

运行结果

请添加图片描述

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

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

相关文章

进程间通信的七种方法实战演示!值得收藏!

文章目录 前言一、管道&#xff08;Pipes&#xff09;管道示例代码&#xff1a;管道示例流程解读&#xff1a;管道示例运行效果&#xff1a; 二、消息队列&#xff08;Message Queues&#xff09;消息队列示例代码消息队列示例流程解读&#xff1a;消息队列示例执行效果 三、共…

分析redis实现分布式锁的思路

文章目录 1、基于redis实现分布式锁&#xff1a;利用key的唯一性1.1、独占排他1.2、死锁问题1.2.1、redis客户端程序获取了锁之后&#xff0c;服务器立马宕机&#xff0c;就会导致死锁。1.2.2、不可重入&#xff1a;可重入 1.3、原子性&#xff1a;加锁和过期之间&#xff1a;s…

【JavaEE】——线程的安全问题和解决方式

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯&#xff0c;你们的点赞收藏是我前进最大的动力&#xff01;&#xff01;希望本文内容能够帮助到你&#xff01; 目录 一&#xff1a;问题引入 二&#xff1a;问题深入 1&#xff1a;举例说明 2&#xff1a;图解双线程计算…

springboot数字化超市管理系统—计算机毕业设计源码34804

摘 要 在网络信息的时代&#xff0c;众多的软件被开发出来&#xff0c;给用户带来了很大的选择余地&#xff0c;而且人们越来越追求更个性的需求。在这种时代背景下&#xff0c;超市只能以用户为导向&#xff0c;按品种小批量组织生产&#xff0c;以产品的持续创新作为超市最重…

ONES 与华为云深度合作,共同打造企业智能研发管理平台

9月20日&#xff0c;在华为全联接大会&#xff08;HUAWEI CONNECT 2024&#xff09;上&#xff0c;深圳复临科技有限公司&#xff08;以下简称“ONES”&#xff09;与华为云计算技术有限公司&#xff08;以下简称“华为云”&#xff09;正式签署合作协议&#xff0c;双方将在企…

Python | Leetcode Python题解之第421题数组中两个数的最大异或值

题目&#xff1a; 题解&#xff1a; class Trie:def __init__(self):# 左子树指向表示 0 的子节点self.left None# 右子树指向表示 1 的子节点self.right Noneclass Solution:def findMaximumXOR(self, nums: List[int]) -> int:# 字典树的根节点root Trie()# 最高位的二…

【图灵完备 Turing Complete】游戏经验攻略分享 Part.6 处理器架构2 函数

新的架构来了&#xff0c;本游戏的最后一个攻略分享&#xff0c;最后汇编部分无非是对于操作码的熟练&#xff0c;硬件没有问题&#xff0c;那么也就无关痛痒了。 汇编实现&#xff0c;两数相或和两数相与非一起相与即可。 八位异或器&#xff0c;整就完事了。 有手就行。 利…

十七、RC振荡电路

振荡电路 1、振荡电路的组成、作用、起振的相位条件以及振荡电路起振和平衡幅度条件&#xff0c; 2、RC电路阻抗与频率、相位与频率的关系曲线; 3、RC振荡电路的相位条件分析和振荡频率

秩一的等价转化

Lemma 2. For a positive semi-definite Hermitian matrix A ∈ C M M \mathbf{A}\in\mathbb{C}^{M\times M} A∈CMM, the condition Rank ( A ) 1 \left(\mathbf{A}\right)1 (A)1 is equivalent to t h e following conditions the\textit{ following conditions} the fol…

JavaWeb 实验一

实验一 环境配置和Web工程的创建 目的&#xff1a; 掌握Java Web编程环境的配置创建简单的Web工程&#xff0c;并了解Web工程下各目录的作用掌握部署、运行Web工程的流程 实验过程&#xff1a; 一、完成如下要求。 安装并设置JDK 1.8、Tomcat 9.0&#xff08;tomcat和jdk版…

PDF转JPG神器!一键转换,轻松搞定文档分享难题

亲爱的朋友们&#xff0c;你是不是也常常被PDF文件格式所困扰&#xff1f;特别是当你想要将PDF文件转换为JPG格式时&#xff0c;是否觉得有些头大呢&#xff1f;别担心&#xff0c;今天我将向你推荐五款非常棒的PDF转JPG工具&#xff0c;它们绝对能让你的转换过程轻松愉快&…

暴力枚举算法

《啊哈&#xff01;算法》学习笔记 本博客的题目仅用暴力枚举&#xff0c;并不一定是最好的解法&#xff0c;主要是了解枚举算法 例题一&#xff1a;两方框奥数 在两个方框内填入相同的数字使得等式成立&#xff1a; 代码如下&#xff1a; for(i1;i<9;i) {if((i*103)*652…

数据结构---二叉搜索树(二叉排序树)

什么是二叉排序树 二叉搜索树又是二叉排序树&#xff0c;当我们的是一颗空树或者具有以下性质时&#xff1a; 左子树不为空&#xff0c;左子树上的值都小于我们的根节点上的值。右子树不为空时&#xff0c;右子树上的值都大于我们的根节点上的值左右子树都是二叉搜索树&#…

Java异常架构与异常关键字

1. Java异常简介 Java 异常是 Java 提供的一种识别及响应错误的一致性机制。 Java 异常机制可以使程序中异常处理代码和正常业务代码分离&#xff0c;保证程序代码更加优雅&#xff0c;并提高程 序健壮性。在有效使用异常的情况下&#xff0c;异常能清晰的回答 what, where,…

2023北华大学程序设计新生赛部分题解

时光如流水般逝去&#xff0c;我已在校园中奋战大二&#xff01;(≧▽≦) 今天&#xff0c;静静回顾去年的新生赛&#xff0c;心中涌起无尽感慨&#xff0c;仿佛那段青春岁月如烟花般绚烂。✧&#xff61;(≧▽≦)&#xff61;✧ 青春就像一场燃烧的盛宴&#xff0c;激情澎湃&…

《高等代数》线性相关和线性无关(应用)

说明&#xff1a;此文章用于本人复习巩固&#xff0c;如果也能帮到大家那就更加有意义了。 注&#xff1a;1&#xff09;线性相关和线性无关的证明方法中较为常用的方法是利用秩和定义来证明。 2&#xff09;此外&#xff0c;线性相关和线性无关的证明常常也会用到反证法。 3&…

2.5 数据库索引机制

我们往数据表里面保存数据记录越来越多&#xff0c;一旦达到上千万条&#xff0c;那怎么提高检索速度就需要认真考虑了。我们打开手机上的APP都希望能快些加载出内容&#xff0c;这里的因素有很多&#xff0c;但是如何减少数据查找的时间是其中的重要一环。索引机制就是提升数据…

怎么给视频加字幕?6种给视频加字幕最简单的方法,不怕你学不会!

在这个快节奏的时代&#xff0c;越来越多的人会在公共场所观看视频&#xff0c;但为了不影响其它人&#xff0c;大多数人往往会将声音关闭。统计数据显示&#xff0c;高达69%的人在这样的环境中会静音观看视频&#xff0c;而有字幕的情况下&#xff0c;80%的人更倾向于完整观看…

刷题训练之栈

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟练掌握字符串算法。 > 毒鸡汤&#xff1a;学习&#xff0c;学习&#xff0c;再学习 ! 学&#xff0c;然后知不足。 > 专栏选自&#xff1a;刷题…

C++之spring

C之spring string类对象的访问及遍历操作 operator[] 返回pos位置的字符&#xff0c;const string类对象调用 这是一个既可以写也可以读的库函数&#xff0c;const修饰的内容是不可以更改的&#xff0c;所以是读 C类与对象里要想普通对象和const修饰的对象同时重载 第二种访…