ProtoBuf序列化框架介绍

news2024/9/21 22:43:01

文章目录

    • 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.coloradmin.cn/o/2153497.html

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

相关文章

【Geoserver使用】启动方法与端口、跨域配置

文章目录 前言一、Windows和Linux下的启动方式1.Windows2.Linux 二、启动端口修改三、跨域配置总结 前言 之前写了一篇Geoserver下载页的文章&#xff0c; 【Geoserver使用】Geoserver下载页介绍&#xff08;稳定版维护版开发版历史版本&#xff09; 今天讲一下Geoserver启动方…

Hadoop的安装和使用

1. Hadoop简介 Hadoop是一个能够对大量数据进行分布式处理的软件框架&#xff0c;并且是以一种可靠、高效、可伸缩的方式进行处理的&#xff0c;它具有以下几个方面的特性。 高可靠性。高效性。高可扩展性。高容错性。成本低。运行在Linux平台上。支持多种编程语言。 2. 分布…

【Linux课程学习】make/Makefile:Linux项目自动化构建工具

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux课程学习 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 &#x1f349;一.make/Makefile的理解&#xff1a; …

【我的 PWN 学习手札】House Of Karui —— tcache key 绕过手法

目录 前言 一、House of Karui 二、测试与模板 前言 早期版本的 tcachebin 由于毫无保护&#xff0c;导致攻击利用非常容易&#xff0c;成为重灾区。tcache dup&#xff0c;也即 tcachebin 中的 double free 利用手法&#xff0c;是攻击者常常选用的攻击方式。然而&#xf…

直通滤波-PassThrough Filter-原理-代码实现

前言 对坐标轴上的上下限进行约束&#xff0c;选取其中符合范围的点云区域使用场景&#xff1a;去除噪声点&#xff0c;关注特定区域&#xff0c;减小计算量 工作流程 假设我们要在 d d d 轴&#xff08; d ∈ { x , y , z } d \in \{x, y, z\} d∈{x,y,z} &#xff09;上…

【电路笔记】-运算放大器积分器

运算放大器积分器 文章目录 运算放大器积分器1、概述2、运算放大器积分器的表示2.1 理想积分器2.2 交流响应2.3 输出公式3、限制4、总结1、概述 在我们之前与运算放大器相关的大多数文章中,配置都是基于带有电阻器作为反馈环路、分压器或互连许多运算放大器的一部分的放大器。…

Redis数据结构之String字符串

二.String字符串 redis中的所有key都是字符串类型&#xff0c;只不过是value类型有差异。 redis中的字符串&#xff0c;直接就是按照二进制的方式存储的&#xff08;不会做任何的编码转换&#xff08;就好像mysql&#xff0c;它默认的字符集是拉丁文&#xff0c;插入中文就会…

Linux 基础IO 2

读取与写入 read与fread 在基础IO 1中我们学会了open和fopen的函数这两个函数是用于为进程打开文件也可以理解为为进程和文件建立了一个链接使其可以交互。那我们建立号链接之后肯定还是需要对文件进行操作&#xff0c;现在我们先来了解读取操作。 read&#xff1a; 这是一…

Leetcode面试经典150题-94.二叉树的中序遍历

给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#xff1a;root [1] 输出&am…

SOMEIP_ETS_120: SD_Initial_Events_after_Subscribe_with_alternate_IPs

测试目的&#xff1a; 验证DUT在接收到Tester的SubscribeEventgroup消息后&#xff0c;能够向Tester指定的IP地址和端口发送SubscribeEventgroupAck确认消息以及对应的初始化字段。 描述 本测试用例旨在确保DUT能够正确处理SubscribeEventgroup消息&#xff0c;并按照消息中…

基于SpringBoot+Vue的健身房管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

自动化直播的未来:2024年必试的10款自动直播App曝光,教你轻松玩转直播!

自动化直播的未来&#xff1a;2024年必试的10款自动直播App曝光&#xff0c;教你轻松玩转直播&#xff01; 随着人工智能技术的飞速发展&#xff0c;自动化直播已经成为当下最热门的趋势之一。2024年&#xff0c;众多创新的AI自动直播App如雨后春笋般涌现&#xff0c;它们不仅…

IO流中的异常捕获

Java简化 接口AutoCloseable

unity3d入门教程九

unity3d入门教程九 20.2播放音频20.3在代码中播放21.1延时调用21.2invoke API21.3消息调用22.1交互界面22.2添加canvas22.3canavas的位置22.4添加text 这里给一个资源网站&#xff0c;可以部分免费下载&#xff0c;音乐和音效超多&#xff0c;支持检索 爱给网 https://www.aige…

【Delphi】创建应用程序和 LiveBindings示例(FMX)

一、创建一个FMX程序 界面上放置上如下3个控件&#xff1a;TProgressBar1, TArcDial1,TTrackBar1。 二、打开LiveBindings Designer 设计器 三、在 LiveBindings Designer 中&#xff0c;您的绑定图只包含对象&#xff0c;您可以将它们连接起来。 四、在设计器中&#xff0c;在…

idea 恢复 pom 文件呈现灰色并带删除线

今天在 idea 中导入别人的项目时发现有几个 pom 文件是灰色的并带删除线。 可以用以下方式解决&#xff1a; 打开file - settings - build,execution,deployment - Build Tools - Maven - Ignored Files 把 pom.xml 前面的复选框去掉&#xff0c;去掉之后&#xff0c;点击 appl…

Kerberos自我总结Kerberos自我总结

1、协议原理与漏洞产生 1.1 kerberos Kerberos协议是一种基于票据Ticket的认证方式&#xff0c;它由三个角色组成&#xff0c;分别是客户端Client、服务端Server和秘钥分发中心KDC。 协议中的交互分为六步&#xff0c;为AS_REQ、AS_REP、TGS_REQ、TGS_REP、AP_REQ和AP_REP …

【Linux】进程地址空间和进程调度队列

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/qinjh_/category_12625432.html 目录 问题现象 进程地址空间 进一步理解 地址空间 Linux2.6内核进程调度队列 …

C++——string的了解和使用

目录 引言 为什么要学习string 1.C语言中的字符串 2.C中的字符串 auto和范围for 1.auto 1.1 auto的介绍 1.2 注意事项 2.范围for 标准库中的string类 1.string类的迭代器 1.1 begin()与end()函数 1.2 rbegin()与rend()函数 2.string类的初始化和销毁 3.string类…

【线程】线程的控制

本文重点&#xff1a;理解线程控制的接口 前言 内核中是没有很明确线程的概念的&#xff0c;只有轻量级进程的概念&#xff0c;不会提供直接给我们线程的系统调用&#xff0c;而会给我们提供轻量级进程的系统调用。我们用户是需要线程的接口的&#xff0c;在应用层&#xff0…