【Protobuf】protobuf详细介绍-二、Protobuf简介

官网地址:Protocol Buffers Documentation

Github地址:GitHub - protocolbuffers/protobuf: Protocol Buffers - Google’s data interchange format

Protobuf(Protocol Buffers)是由 Google 开发的一种轻量级、高效的数据交换格式,它被用于结构化数据的序列化、反序列化和传输。相比于 XML 和 JSON 等文本格式,Protobuf 具有更小的数据体积、更快的解析速度和更强的可扩展性。同时他是一种语言无关、平台无关、可扩展的序列化格式。它使开发人员能够在文件中定义结构化数据.proto,然后使用该文件生成可以从不同数据流写入和读取数据的源代码。

2.1、核心思想

Protobuf 核心思想是使用协议来定义数据的结构和编码方式。协议是一个文本文件,其中定义了消息的结构。消息由字段组成,每个字段都有一个名称、类型和可选的默认值。然后使用Protobuf提供的解码器生成对应代码,用于序列化和反序列化数据,由于Protobuf是基于二进制编码,因此可以跨语言使用。

Protobuf 支持以下数据类型:

基本类型:例如 int32、string、bool 等
复合类型:例如 message、enum 等

2.2、Protobuf是如何工作的?

Protobuf 使用二进制数据格式,与基于文本的格式相比,它更紧凑且读写速度更快。它还提供了接口定义语言(IDL),可以轻松定义要序列化的数据的结构。

Protobuf 文件使用文件扩展名保存.proto。该.proto文件以 Protobuf 的 IDL 格式编写,包含有关数据结构的所有信息。数据被建模为“消息”,即名称/值对组。以下是文件中简单 Protobuf 消息的示例.proto:

// 指定 Protobuf 版本为版本 3(最新版本)
syntax = "proto3";
 
// 指定protobuf包名,防止类名重复
package com.iot.protobuf;
 
// 生成的文件存放在哪个包下,对于新手来说,不指定生成到哪个目录下即可,不建议指定包(否则,可能让你怀疑人生)
// option java_package = "com.iot.protos";
 
// 生成的类名,如果没有指定,会根据文件名自动转驼峰来命名
option java_outer_classname = "StudentProto";
 
// 定义了一个Student类
message Student {
    // 后面的值(1、2、3、4等)作为序列化后的二进制编码中的字段的唯一标签
    // 因为 1-15比 16 会少一个字节,所以尽量使用 1-15 来指定常用字段。
    int32 id = 1;
    string name = 2;
    string email = 3;
    string address = 4;
}

示例中,客户消息包含四个字段:id、name、email和address。每个字段都有其类型指示,以及指示其是否为required、optional或 的标签repeated。

该.proto文件可以使用 Protoc(即 Protobuf 编译器)编译成多种编程语言。该编译器以开发人员指定的编程语言生成源代码。该源代码包括用于写入、读取和操作.proto文件中定义的消息类型的类和方法。

当有数据要存储或传输时,可以创建生成的类的实例并用您的数据填充它们。然后将这些实例序列化为二进制格式。读取数据时,二进制格式将反序列化回从.proto文件生成的类的实例。这使您可以轻松访问结构化数据。

Protobuf 生成的二进制数据格式是平台无关的,可用于在不同系统、应用程序或服务之间交换数据,即使它们是用不同的编程语言实现或在不同的平台上运行的。

2.3、如何使用 Protoc 生成代码?

上面定义好的.proto,可以使用Protobbuf编译器(Protoc)将文件编译成不同语言。

在这里插入图片描述
下载编译器(根据系统下载不同的编译器):https://github.com/protocolbuffers/protobuf/releases/tag/v26.1

在这里插入图片描述

2.4 入门命令


注意:编译文件即执行 protoc 命令的前提是 要在proto 文件所在目录。

命令格式:

protoc --java_out=Java文件输出目录 需要编译的proto文件

以下是我自己电脑(Windows11)上的编译过程:

编译成java语言:(需要编译的文件可以是多个,以空格隔开即可)

protoc --java_out=E:\PracticeProject\java-project\spring-boot-udp\udptest-master\src\main\java\com\example\zyz\udp\ Response.proto Student.proto

编译命令如下面的代码将.proto文件编译成 c++:(需要编译的文件可以是多个,以空格隔开即可)

protoc --cpp_out=E:\PracticeProject\java-project\spring-boot-udp\udptest-master\src\main\java\com\example\zyz\udp\ Response.proto Student.proto

如果上述命令没有报错即代表执行成功。如图所示:

在这里插入图片描述




本文完结!
上一篇:All in One mini主机搭建全屋主路由方案----自己实现自己的路由器,实现路由器*!


下一篇:CMUS狮身人面像(六)-调整语音识别准确性