【ProtoBuf】protobuf序列化协议

news2025/4/7 5:24:45

Protobuf介绍

Protobuf (Protocol Buffers) 是谷歌开发的一款无关平台,无关语言,可扩展,轻量级高效的序列化结构的数据格式,用于将自定义数据结构序列化成字节流,和将字节流反序列化为数据结构。所以很适合做数据存储和为不同语言,不同应用之间互相通信的数据交换格式,只要实现相同的协议格式,即后缀为proto文件被编译成不同的语言版本,加入各自的项目中,这样不同的语言可以解析其它语言通过Protobuf序列化的数据。目前官方提供c++,java,go等语言支持。

下面表格是支持语言的列表及各个语言的插件

支持语言很多,C++ java python php golang 等

Protobuf应用场景

对于protobuf的使用场景,简单来说,业务要求命中其优点越多,缺点越少,就更能够使用Protobuf,比如说在某些场景对消息大小很敏感,或者传输的数据量不大,比如说APP登录场景,那么可以考虑使用Protobuf

选择序列化协议需要考虑哪些

  • 序列化之后的数据流的大小(占用网络带宽),对于高并发的场景下这点很重要。
  • 序列化和反序列化的性能(占用CPU和内存资源)。
  • 是否支持多语言。

常见数据交互格式对比

  • JSON (JavaScript Object Notation):一般用于WEB项目中,因为浏览器对JSON格式的数据支持非常好,大部分编程语言有很多内建函数支持,而且JSON几乎支持所有编程语言。
  • XML:XML在WebService中的应用比较多,相比于JSON,它的数据更加冗余,因为需要成对的闭合标签,而JSON使用了键值对的方式,不仅压缩了一定的数据空间,同时也有更好的可读性。
  • Protobuf:谷歌公司新开发的一种数据格式,适合高性能,对响应速度有要求的数据传输场景。因为Protobuf是二进制数据格式,需要编码和解码。数据本身不具有可读性,因此只能反序列化得到可读数据。

相对于其他数据格式Protobuf的优势:

  • 序列化后体积比JSON和XML小,适合网络传输。
  • 序列化反序列化速度快,比JSON的处理速度快。
  • 消息格式升级和兼容性还不错。

Protobuf的序列化与反序列化.

  • 序列化:将数据结构或者对象转化成二进制串的过程。
  • 反序列化:将序列化过程中所产生的二进制串转换成数据结构或对象的过程。

Protobuf的优点和缺点

优点:

  • Protobuf序列化速度快,序列化后的体积比xml更小,传输更快。使用相对也简单,因为Proto编译器能自己序列化和反序列化。
  • 可以定义自己的数据结构,然后使用代码生成器去生成的代码来读写这个数据结构,甚至可以在不用重新部署的情况下来更新这个数据结构,只需要使用Protobuf对数据结构进行一次描述,就可以利用不同的语言或者从不同的数据流对你的结构化数据轻松的读写。
  • 向后兼容性好,不需要破坏旧的数据格式,依靠老的数据格式的程序就可以对数据结构更新。
  • 语义比xml更加清晰,无需类似xml解析器的东西(因为Protobuf编译器会将.proto文件编译成对应的数据访问用以对Protobuf数据进行序列化和反序列化操作)。
  • 跨平台,跨语言,可扩展性好。
  • 维护成本比较低,多个平台只需要维护一套.proto对象协议文件。
  • 加密性好。

缺点:

  • Protobuf功能简单,无法用来表示复杂的概念。
  • 相比xml,xml具有某种程度的自解释性,因为最终是转成二进制流,不像xml和json能够直接查看明文。

那么为什么不直接使用XML

同XML相比,Protobuf的优势在于高性能,它以高效的二进制存储方式比XML小3到10倍,快20到100倍,原因在于:

  • ProtoBuf序列化后所生成的二进制消息非常紧凑。
  • ProtoBuf封解包过程非常简单。

protobuf对传输的数据采取一种最简单的key-value形式的存储方式(但其中有一种类型的数据不是k-v形式,后面会讲),这钟存储方式极大的节省了空间。除此之外protobuf还采取了varint(变长编码)形式来压缩数据,对体积较小的字段分配较少的空间,由此使得压缩后的文件非常“紧凑”。

Protobuf语法

要想使用Protobuf就需要先定义proto文件,先熟悉protobuf消息定义的相关语法。

1. 定义消息类型

syntax = "proto3";

message SendRequest {
  string query = 1;
  int32 page_number = 2;
  repeated int32 result_per_page = 3;
}

.proto文件的第一行指定了使用proto3语法,说明使用的是proto3版本。如果省略protocol buffer编译器就默认使用proto2语法。他必须是文件中非空非注释行的第一行。

message表示消息类型,可以有多个。

SendRequest定义中指定了三个字段(name/value键值对),每个字段都会有名称和类型。

repeated是字段规则。

Protobuf各个语言标量类型对应关系

一个标量消息字段可以含有一个如下类型,下面表格定义了在.proto文件中的类型,以及与之对应在自动生成访问类中定义类型。
在这里插入图片描述

2. 定义字段的规则

message的字段必须符合以下规则:

singular:一个遵循singular规则的字段,在一个结构良好的message消息体(编码后的message)可以有0或1个该字段(但是不可以有多个)。这是proto3语法的默认字段规则。(这个理解起来有些晦涩,举例来说上面例子中三个字段都是singular类型的字段,在编码后的消息体中可以有0或者1个query字段,但不会有多个。)

repeated:遵循repeated规则的字段在消息体重可以有任意多个该字段值,这些值的顺序在消息体重可以保持(就是数组类型的字段)

3. 添加更多消息类型

在单个.proto文件中可以定义多个message,这在定义多个相关message时非常有用。比如说,我们定义SendRequest对应的响应messageSendResponse,把它加到之前的.proto文件中。

syntax = "proto3";

message SendRequest {
  string query = 1;
  int32 page_number = 2;
  repeated int32 result_per_page = 3;
}

message SendResponse {
 ...
}

4. 添加注释

.proto文件中的注释和C,C++的注释风格相同,使用// 和 /* … */

syntax = "proto3";

message SendRequest {
  string query = 1;         // 查询
  int32 page_number = 2;    // 页码
  repeated int32 result_per_page = 3;   //分页数
}

5. message支持嵌套使用

message SendResponse {
    message Result {
        string url = 1;
        string title = 2;
        repeated string snippets = 3;
    }
    repeated Result results = 1;
}

6.使用其它消息类型

可以将其它消息类型作为字段的类型,如下,有多个message中都包含Person类型,此时就可以在相同的.proto文件定义一个Person类型,然后在需要用到的message中指定一个Person字段。

message Personinfo {
        repeated Person info = 1;
}
message Person {
        string name = 1;
        int32 age = 2;
        repeated int32 weight = 3;
}

上面也可以嵌套在一起写

message Personinfo {
        message Person {
            string name = 1;
            int32 age = 2;
            repeated int32 weight = 3;
        }
        repeated Person info = 1;
}

如果想在它的父消息类型外部重用这个消息类型,可以使用Personinfo.Person的方式

message PersonMessage {
    Personinfo.Person info = 1
}

7. 定义服务(Service)

如果想将消息类型用在RPC系统中,可以在.proto文件中定义一个RPC服务接口,protobuf编译器会根据所选择语言生成对应语言的服务接口代码及存根。例如定义一个RPC服务并具有一个方法,该方法能够接受SearchRequest并返回一个SearchResponse,此时就可以在.proto文件进行如下定义:

service SearchService {
    //rpc(rpc关键字) 服务函数名  (传入参数) 返回(返回参数)
      rpc  Search (SearchRequest) returns (SearchResponse) ;
}

gRPC就是使用Protobuf的一个RPC系统,gRPC在使用Protobuf时候非常有效。

Protobuf是如何工作的

.proto文件是protobuf一个重要的文件,它定义了需要序列化数据的结构,当protobuf编译器(protoc)来运行.proto文件时候,编译器将生成所选择的语言的代码,比如你选择go语言,那么就会将.proto转换成对应的go语言代码,对于go来说,编译器会为每个消息类型生成一个pd.go文件,而C++会生成一个.h文件和一个.cc文件。

使用protobuf的3个步骤是:

  • 在.proto文件中定义消息格式。
  • 用protobuf编译器编译.proto文件。
  • 用C++/Java/go等对应的protobuf API来写或者读消息。

在.proto文件定义消息,message是.proto文件最小的逻辑单元,由一系列name-value键值对构成。下面的.proto文件定义了一个"人"的消息:

message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  repeated PhoneNumber phone = 4;
}

message消息包含一个或多个编号唯一的字段,每个字段由字段限制,字段类型,字段名和编号四部分组成,字段限制分为:optional(可选的)、required(必须的)以及repeated(重复的)。定义好消息后,使用ProtoBuf编译器生成C++对应的.h和.cc文件,源文件提供了message消息的序列化和反序列化等方法

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

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

相关文章

容器底层实现技术

一、Namespace 和 Cgroup 1、容器技术发展历史 2、Docker 容器实现原理 1. Docker 容器在实现上通过 namespace 技术实现进程隔离, 通过Cgroup 技术实现容器进程可用资源的限制 3、Namespace Namespace :命名空间 1. 作用:资源隔离 2. 原理&…

web前端课程作业设计:个人简历

一.说明 今天博主的web前端选修课结课了,期末大作业也提交了,今天写一篇博客把我的大作业分享给大家。 二.题目 1. 大作业题目 个人简历主页设计 2. 内容要求 应尽量包含以下内容: 包含个人基本信息、教育背景、个人风采、与我联系四块…

企业四要素核验-企业四要素核验接口-api接口

接口地址: https://登录后显示/pyi/184/358(支持:http/https)) 在线查询:https://www.wapi.cn/api_detail/184/358.html 网站地址:https://www.wapi.cn 返回格式:json,xml 请求方式:GET,POST 请求说明: …

【实用篇】Elasticsearch01

分布式搜索引擎01 – elasticsearch基础 1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 例如: 在GitHub搜索…

智慧公厕系统如何通过物联网技术提高公厕的管理效率

智慧公厕系统可以通过物联网技术,实现公共卫生间的智能化管理和服务,提高管理效率。本文将详细介绍智慧公厕系统如何通过物联网技术提高公共卫生间的管理效率,从硬件、软件、系统等方面逐一分析。 XP-智慧厕所方案-HYF20230328(16…

工业企业为什么要用边缘计算网关?

在我们进入智能制造和工业4.0的新时代,工业企业的数据需求正急速增长。传感器,机器和设备每分钟都在产生大量数据,它们对实时处理和分析的需求比以往任何时候都要强烈。这就是为什么工业企业需要边缘计算网关。 边缘计算网关在物联网架构中担…

大数据:Apache hive分布式sql计算平台,hive架构,hive部署,hive初体验

大数据:Apache hive分布式sql计算平台 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle&a…

Java002——JDK的安装以及配置环境变量

为什么要安装jdk 1、JDK 全称 Java Development Kit,意为 Java 开发工具。,要想开发java程序就必须安装JDK。没有JDK的话,无法编译运行Java程序。 2、JDK包含的基本组件包括以下文件:   javac.exe,用于编译java文件&#xff0c…

不经意传输(OT)了解

概述 OT,不经意传输,常被大量用于安全多方计算中,能够很大程度决定一个SMPC协议的效率。它的核心概念是接收方可以从发送方(持有秘密信息)手中选择性接收自己想要的信息而接收方对所选择的信息内容一无所知。目前有2-…

乐谱文件转换,支持批量mscz、mxl、musicxml转mp3等格式

我是一个喜欢听音乐的人,每天都会在路上听着歌放松自己。但是有时候想要听的歌并没有下载下来,或者格式不兼容。 最近我发现了一个神奇的软件——mscz转mp3,可以把乐谱文件转成mp3格式! 软件界面简洁明了,使用也非常…

js的Bom操作

1.认识Bom ◼ BOM:浏览器对象模型(Browser Object Model)  简称 BOM,由浏览器提供的用于处理文档(document)之外的所有内容的其他对象;  比如navigator、location、history等对象&#xff1…

YOLOv5改进系列(6)——替换主干网络之 ShuffleNetV2

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制

预约直播|揭秘鸿蒙全新流量阵地,元服务带来的体验变革

【导读】 在PC 互联网到移动互联网的演进过程,随着人们对交互和信息获取的智能化要求越来越高,移动终端上的应用生态发展到今天也面临着变革。传统厚重的App,功能齐全,但开发成本高、周期长,且存在搜索、安装、卸载等…

Mybatis-Plus实战

文章目录 #简介#特性#支持数据库总结1、Mybatis-Plus常用注解2、[条件构造器](https://www.baomidou.com/pages/10c804/#abstractwrapper)2.1 介绍2.2 条件 3、Mybatis-Plus属性配置3.1 Mybatis-Plus常用配置项3.2 mybatis-plus.configuration. 下配置项3.3 配置小结 4、CRUD实…

javascript基础十四:解释下什么是事件代理?应用场景?

一、是什么 事件代理,俗地来讲,就是把一个元素响应事件(click、keydown…)的函数委托到另一个元素 前面讲到,事件流的都会经过三个阶段:捕获阶段 -> 目标阶段 -> 冒泡阶段,而事件委托就是…

MFA多因素认证:保护你的邮箱、VPN等账户免遭黑客入侵

多因素认证(MFA)是防范黑客攻击的重要防线之一。在密码被越来越容易被破解的情况下,多因素认证让你的账户更加安全。本文将详细讲解多因素认证是什么、如何工作以及如何设置多因素认证来保护你的账户。 什么是MFA多因素认证 简单地说&#xf…

AIGC+开放式社交,为年轻人注入了新的“Soul”?

5月21日全国助残日,Soul App举办了一场与众不同的线上公益活动,邀请视障用户担任“见习解忧师”,诉说世界更多角落“不完美”的故事,展示人生更多可能,传递温暖与爱。 参与此次派对的“见习解忧师”都是Soul平台上充满…

OTP动态口令身份认证的多种形式

密码无处不在,但却出了名的弱。因此需要新的工具和技术来减少或减轻账户被接管(ATO)的风险。OTP动态口令身份认证的主要目的就是要确保该用户的身份足够可信。现在,最常见的方法是通过增加某种认证令牌来提供MFA多因素认证。 令牌…

Linux:日志文件分析

日志文件的分类 1内核及系统日志 由系统服务syslog统一进行管理,日志格式基本相似 2 用户日志:记录系统用户登录及退出系统的相关信息 3 程序日志;由各种应用程序独立管理的日志文件,记录格式不统一 日志文件 日志保存位置&#…

day43_crud

一、CRUD (create, read (retrieve), update, delete) 增 查 改 删 1.1 代码规范 com.qf.功能名.类名 – com.qf.model.Xxx 实体类 com.qf.util.Xxx 工具类 com.qf.servlet.XxxServlet Servlet类,主要是做接收请求作出响应 com.qf.dao.XxxDao Dao类. Data Access Obje…