当前位置: 首页 > news >正文

高效序列化工具(1)-----Protobuf

目录

1.Protobuf

Protobuf 的特点

工作原理

Protobuf 与 JSON、XML 的对比

2.protobuf语法

1.数据类型

 2.消息

3.枚举

4.嵌套消息

5.重复字段

6.默认值

7.其他类型

1.oneof类型

2.any类型

8.文件组织

3.protobuf命令

1.常见命令

选项:

1. --proto_path 或 -I

2. --cpp_out


1.Protobuf

        Protocol Buffers(简称 Protobuf)是由 Google 开发的一种语言中立、平台中立、可扩展的序列化结构数据格式。它通常用于数据存储、网络通信等场景。Protobuf 可以在不同的语言(如 C++、Java、Python 等)之间高效地交换数据。

Protobuf 的特点

  1. 高效的二进制格式:Protobuf 使用紧凑的二进制格式进行数据序列化,相比于 XML 或 JSON 等文本格式,数据量更小、传输更快。
  2. 跨语言支持:Protobuf 支持多种编程语言,如 C++、Java、Python、Go、Ruby、C# 等,可以在不同语言的应用程序之间进行数据交换。
  3. 易于扩展:Protobuf 提供了版本控制机制,可以在不破坏已有数据结构的情况下进行向后兼容的扩展。
  4. 简单易用的定义:通过一种专用的 IDL(接口定义语言)定义数据结构,使得数据序列化和反序列化过程变得简单。

工作原理

  1. 定义数据结构:你首先用一种类似于结构体的方式,使用 Protobuf 的 .proto 文件来定义数据结构。
  2. 编译:然后使用 Protobuf 提供的编译器(protoc)将 .proto 文件编译成目标语言的源代码。
  3. 序列化和反序列化:生成的代码包含序列化(将对象转换为字节流)和反序列化(将字节流恢复为对象)的逻辑。

Protobuf 与 JSON、XML 的对比

特性protobufjsonxml
数据格式二进制文本格式文本格式
可读性不可读可读可读
数据大小非常紧凑,较小较大较大
性能非常快较慢较慢
支持的语言多种语言支持多种语言支持多种语言支持
扩展性较弱较弱

2.protobuf语法

        protobuf在使用时需要指定语法版本:

syntax = "proto3";  // 指定 Protobuf 语法版本

1.数据类型

        protobuf支持多种数据类型,具体如下:

  • int32, int64: 有符号整数(32位/64位)
  • uint32, uint64: 无符号整数(32位/64位)
  • sint32, sint64: 有符号整数,采用 ZigZag 编码来提高编码效率
  • fixed32, fixed64: 无符号整数,固定大小,性能更好
  • sfixed32, sfixed64: 有符号整数,固定大小
  • float, double: 浮动精度(32位/64位)
  • bool: 布尔值(truefalse
  • string: 字符串(UTF-8 编码)
  • bytes: 原始字节数据
message Example {int32 id = 1;string name = 2;float value = 3;
}

 2.消息

        Protobuf 的核心是 Message(消息),它是数据结构的基础单位。消息由字段(fields)组成,每个字段都有类型、名称和唯一的字段编号。

message Person {string name = 1;  // 字段名称和编号int32 id = 2;string email = 3;
}
  • 每一个字段都有一个字段编号,他是唯一的,按顺序分配
  • 字段编号是正整数,不能修改

3.枚举

        Protobuf 还支持枚举类型,适用于定义一组常量。

enum Status {ACTIVE = 0;   // 默认值INACTIVE = 1;PENDING = 2;
}message Person {string name = 1;Status status = 2;  // 使用枚举类型
}

4.嵌套消息

        消息可以嵌套其他消息,也可以定义重复字段。

message Address {string street = 1;string city = 2;string postal_code = 3;
}message Person {string name = 1;Address address = 2;  // 嵌套消息
}

5.重复字段

        repeated修饰符用于定义数组或列表字段,可以存储多个值。

message Person {string name = 1;repeated string phone_numbers = 2;  // 可以存储多个电话号码
}

6.默认值

        在 proto3 中,所有字段有默认值,string 类型默认为空字符串,int32 默认为 0,bool 默认为 falseenum 类型默认为第一个枚举值。

7.其他类型

1.oneof类型

  oneof 用于在消息中定义互斥字段,只有一个字段可以有值。

message Person {oneof contact {string email = 1;string phone = 2;}
}

2.any类型

        Protobuf 允许定义动态类型字段,称为 Any 类型,表示可以存储任何类型的数据。

import "google/protobuf/any.proto";message Container {google.protobuf.Any item = 1;
}

8.文件组织

        通常会将不同的消息和服务定义放在多个 .proto 文件中,并通过 import 来引用。

import "address.proto";  // 引入外部的 proto 文件message Person {string name = 1;Address address = 2;  // 使用外部定义的 Address 类型
}

3.protobuf命令

1.常见命令

   protoc 是 Protobuf 提供的编译器,用于将 .proto 文件编译为不同语言的源代码。

protoc [OPTION] PROTO_FILES

选项:

1. --proto_path-I

   --proto_path 用于指定 .proto 文件的搜索路径。当你的 .proto 文件引用了其他 .proto 文件时,必须指定该选项。

protoc -I=src --python_out=out src/person.proto
2. --cpp_out

        此选项用于指定输出的 C++ 代码目录。Protobuf 会根据 .proto 文件生成相应的 C++ 类。

protoc --cpp_out=./generated person.proto

        注:其他语法用法相同

相关文章:

高效序列化工具(1)-----Protobuf

目录 1.Protobuf Protobuf 的特点 工作原理 Protobuf 与 JSON、XML 的对比 2.protobuf语法 1.数据类型 2.消息 3.枚举 4.嵌套消息 5.重复字段 6.默认值 7.其他类型 1.oneof类型 2.any类型 8.文件组织 3.protobuf命令 1.常见命令 选项: 1. --proto_…...

湛江市社保卡申领指南:手机获取电子照片回执单号

在湛江市,社保卡的申领流程已经实现了数字化,为市民带来了极大的便利。特别是通过手机获取数码照片回执单号,这一环节更是简化了申领过程。今天,我们将详细介绍如何不去照相馆,利用手机来获取数码照片回执单号&#xf…...

HTML5实现剪刀石头布小游戏(附源码)

文章目录 1.设计来源1.1 主界面1.2 皮肤风格1.2 游戏中界面 2.效果和源码源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/143798520 HTM…...

TypeScript之常见类型

常见类型(Everyday Types) 本章我们会讲解 JavaScript 中最常见的一些类型,以及对应的描述方式。注意本章内容并不详尽,后续的章节会讲解更多命名和使用类型的方式。 类型可以出现在很多地方,不仅仅是在类型注解 (type annotations)中。我们不仅要学习类型本身,也要学习…...

MacOS java多版本安装与管理-sdkman

安装sdkman curl -s "https://get.sdkman.io" | bashsource "$HOME/.sdkman/bin/sdkman-init.sh"sdk version正常出现sdkman版本号就安装成功了 # 安装java # 安装java8 sdk install java 8.0.412.fx-zulu建议和上述一样安装 fx-zulu 的jdk&#xff0c…...

NLP论文速读(多伦多大学)|利用人类偏好校准来调整机器翻译的元指标

论文速读|MetaMetrics-MT: Tuning Meta-Metrics for Machine Translation via Human Preference Calibration 论文信息: 简介: 本文的背景是机器翻译(MT)任务的评估。在机器翻译领域,由于不同场景和语言对的需求差异&a…...

20241121 android中树结构列表(使用recyclerView实现)

1、adapter-item的布局 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"wrap_content&…...

达索系统亮相第三十一届中国汽车工程学会年会暨展览会

伴随着改革开放以及中国入世WTO&#xff0c;三十多年来&#xff0c;中国汽车产销已经成为世界最大的单一市场而独占鳌头。近十年来&#xff0c;另辟蹊径的中国汽车产业人在新能源汽车赛道上引领了一波又一波令全球惊艳的创新成就&#xff0c;成为最为靓丽的新出口三大件的头牌。…...

Python网络爬虫实践案例:爬取猫眼电影Top100

以下是一个Python网络爬虫的实践案例&#xff0c;该案例将演示如何使用Python爬取猫眼电影Top100的电影名称、主演和上映时间等信息&#xff0c;并将这些信息保存到TXT文件中。此案例使用了requests库来发送HTTP请求&#xff0c;使用re库进行正则表达式匹配&#xff0c;并包含详…...

ROSSERIAL与Arduino IDE交叉开发(UBUNTU环境,包含ESP32、arduino nano)

ROSSERIAL与Arduino IDE交叉开发 一、简介二、安装1、Ubuntu下的Arduino IDE安装 **针对ESP32报错问题原因溯源和修改**三、运行结点 一、简介 这个教程展示在ubuntu环境下如何利用Arduino IDE配合rosserial开发机器人部件。通过Arduino IDErosserial实现arduino/esp32开发板通…...

爬虫开发工具与环境搭建——使用Postman和浏览器开发者工具

第三节&#xff1a;使用Postman和浏览器开发者工具 在网络爬虫开发过程中&#xff0c;我们经常需要对HTTP请求进行测试、分析和调试。Postman和浏览器开发者工具&#xff08;特别是Network面板和Console面板&#xff09;是两种最常用的工具&#xff0c;能够帮助开发者有效地捕…...

ceph 18.2.4二次开发,docker镜像制作

编译环境要求 #需要ubuntu 22.04版本 参考https://docs.ceph.com/en/reef/start/os-recommendations/ #磁盘空间最好大于200GB #内存如果小于100GB 会有OOM的情况发生,需要重跑 目前遇到内存占用最高为92GB替换阿里云ubuntu 22.04源 将下面内容写入/etc/apt/sources.list 文件…...

游戏引擎学习第19天

介绍 这段内容描述了开发者在进行游戏开发时&#xff0c;对于音频同步和平台层的理解和调整的过程。以下是更详细的复述&#xff1a; 开发者表达了他希望今天继续进行的工作内容。他提到&#xff0c;昨天他讲解了一些关于音频的内容&#xff0c;今天他想稍微深入讲解一下他正…...

简单实现vue2响应式原理

vue2 在实现响应式时&#xff0c;是根据 object.defineProperty() 这个实现的&#xff0c;vue3 是通过 Proxy 对象实现&#xff0c;但是实现思路是差不多的&#xff0c;响应式其实就是让 函数和数据产生关联&#xff0c;在我们对数据进行修改的时候&#xff0c;可以执行相关的副…...

TypeScript 中扩展现有模块的用法

declare module 是 TypeScript 中用于扩展现有模块的特性。它允许开发者在已有模块的基础上&#xff0c;添加新的功能&#xff08;比如扩展接口、添加类型声明等&#xff09;。通过 declare module&#xff0c;可以将额外的声明合并到原模块中。以下是用法详解&#xff1a; 用…...