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

Protocol Buffers 介绍

Protocol Buffers

Protocol Buffers ,协议缓冲区。什么是Protocol Buffers呢?或者我们简称PB 吧。那么Protocol Buffers 是一种与语言无关、与平台无关的可扩展机制,用于序列化结构化的数据。
example

message Person {optional string name = 1;optional int 32 id = 2;optional string email = 3;
}

自定义一个协议

Person john = Person.newBuilder().setId(1234).setName("John Doe").setEmail("jdoe@example.com").build();
output = new FileOutputStream(args[0]);
john.writeTo(output);Person john = Person.newBuilder().setId(1234).setName("John Doe").setEmail("jdoe@example.com").build();
output = new FileOutputStream(args[0]);
john.writeTo(output);

使用生成的类持久化数据

什么是Protocol Buffers ?
协议缓冲区是谷歌的语言中立、平台中立、可扩展的机制,用于序列化结构化数据。比如xml,但是相比较xml 更小,更快,更简洁。您可以定义一次数据的结构化方式,然后可以使用特殊生成的源代码,使用各种语言,轻松地将结构化数据写入各种数据流和从各种数据流中读取结构化的数据。

支持的语言?
协议缓冲区目前支持java、python、objective-c 和c++ 中生成的代码。有了我们新的proto3语言版本,还可以使用Kotlin、Dart、Go、Ruby、PHP和C#,以及更多的语言。

怎么工作?
1、下载按照pb(协议缓冲区) 编译器
2、阅读概要
3、试试你选择的语言教程

Proto 2

This guide describes how to use the protocol buffer language to structure your protocol buffer data,including .proto file syntax and how to generate data access classes from your .proto files.It covers the proto2 version of the protocol buffers language:for infomation on proto3 syntax,see the Proto3 Language Guide.
本指南介绍了如何使用协议缓冲区语言来构建协议缓冲区数据,包括.proto文件语法以及如何从.proto文件生成数据访问类。它涵盖了proto2版本的协议缓冲语言:有关proto3语法的信息,请参阅proto3语言指南。

定义一个消息类型

message SearchRequest {required string query = 1;optional int32 page_number = 2;optional int32 result_per_page = 3;
}

指定字段类型

在上面的示例中,所有字段都是标量类型:两个整数(page_number和result_per_page)和一个字符串(query)。您也可以像为字段指定其他消息类型一样指定枚举和复合类型

指定字段编号

消息定义中的每个字段都有一个唯一的数字。这些数字用于标识消息二进制格式的字段,一旦使用消息类型,就不应该更改这些数字。范围为1到15的字段号需要一个字节进行编码,包括字段号和字段类型(您可以在协议缓冲区编码中找到更多信息)。16到2047范围内的字段编号占用两个字节。因此,您可以为频繁出现的消息元素保留字段编号1到15.请记住为将来可能添加的频繁出现的元素留出一些空间。
您可以指定的最小字段号为1,最大字段号为229-1或536870911。您也不能使用数字19000到19999(FieldDescriptor::kFirstReservedNumber到FieldDescriptor::kLastReservedNumber),因为它们是为协议缓冲区实现保留的-如果您在.proto中使用这些保留数字中的一个,协议缓冲区编译器会抱怨。同样,您不能使用任何以前保留的字段数字

指定字段规则

您可以指定消息字段是以下字段之一:
必需:一个格式良好的消息必须恰好包含其中一个字段。
可选:格式良好的消息可以有零个或一个此字段(但不能超过一个)。
repeated:此字段可以在格式良好的消息中重复任意次数(包括零次)。重复值的顺序将被保留。
由于历史原因,标量数字类型的重复字段(例如,int32、int64、enum)的编码效率不如预期。新代码应该使用特殊选项[packed=true]来获得更高效的编码。例如:

repeated int32 samples = 4 [packed = true];
repeated ProtoEnum results = 5 [packed = true];

You can find out more about packed encoding in Protocol Buffer Encoding.

Important
Required Is Forever You should be very careful about marking fields as required. If at some point you wish to stop writing or sending a required field, it will be problematic to change the field to an optional field – old readers will consider messages without this field to be incomplete and may reject or drop them unintentionally. You should consider writing application-specific custom validation routines for your buffers instead.

A second issue with required fields appears when someone adds a value to an enum. In this case, the unrecognized enum value is treated as if it were missing, which also causes the required value check to fail

添加更多的消息类型

在一个.proto文件中可以定义多个消息类型。如果您正在定义多个相关消息,这很有用,例如,如果您想定义与SearchResponse消息类型相对应的回复消息格式,可以将其添加到相同的格式中。proto:

message SearchRequest {required string query = 1;optional int32 page_number = 2;optional int32 result_per_page = 3;
}message SearchResponse {...
}

组合消息会导致膨胀虽然可以在单个.proto文件中定义多个消息类型(如消息、枚举和服务),但当在单个文件中定义大量具有不同依赖关系的消息时,也会导致依赖关系膨胀。建议每个.proto文件包含尽可能少的消息类型

添加注释

To add comments to your .proto files, use C/C+±style // and /* … */ syntax.

/* SearchRequest represents a search query, with pagination options to* indicate which results to include in the response. */message SearchRequest {required string query = 1;optional int32 page_number = 2;  // Which page number do we want?optional int32 result_per_page = 3;  // Number of results to return per page.
}

// 单行
/**/多行

保留字段

如果通过完全删除字段或注释掉字段来更新消息类型,则未来的用户可以在对该类型进行自己的更新时重用字段号。如果他们以后加载相同.proto的旧版本,包括数据损坏、隐私漏洞等,这可能会导致严重问题。确保这种情况不会发生的一种方法是指定已删除字段的字段号(和/或名称,这也可能导致JSON序列化问题)是保留的。如果将来有用户试图使用这些字段标识符,协议缓冲区编译器将发出抱怨。

message Foo {reserved 2, 15, 9 to 11;reserved "foo", "bar";
}

保留字段编号范围包括在内(9到11与9、10、11相同)。请注意,不能在同一保留语句中混用字段名和字段号

What’s Generated From Your .proto?

当你在.proto上运行协议缓冲区编译器时,编译器会用你选择的语言生成代码,你需要使用文件中描述的消息类型,包括获取和设置字段值,将消息序列化到输出流,以及从输入流解析消息。
对于C++,编译器从每个.proto生成一个.h和.cc文件,文件中描述的每个消息类型都有一个类。

对于Java,编译器为每种消息类型生成一个.Java文件,其中包含一个类,以及用于创建消息类实例的特殊Builder类。

Python有点不同——Python编译器生成一个模块,其中包含.proto中每个消息类型的静态描述符,然后与元类一起使用,以在运行时创建必要的Python数据访问类。

对于Go,编译器会生成一个.pb.Go文件,其中包含文件中每个消息类型的类型

可选字段和默认值

如上所述,消息描述中的元素可以标记为可选。格式良好的消息可以包含也可以不包含可选元素。解析消息时,如果消息不包含可选元素,则访问解析对象中的相应字段将返回该字段的默认值。默认值可以指定为消息描述的一部分。例如,假设您希望为SearchRequest的result_per_page值提供默认值10。

optional int32 result_per_page = 3 [default = 10];

如果没有为可选元素指定默认值,则使用特定类型的默认值:对于字符串,默认值为空字符串。对于字节,默认值为空字节字符串。对于bools,默认值为false。对于数字类型,默认值为零。对于枚举,默认值是枚举的类型定义中列出的第一个值。这意味着在向枚举值列表的开头添加值时必须小心。有关如何安全更改定义的指导方针,请参阅“更新消息类型”部分

相关文章:

Protocol Buffers 介绍

Protocol Buffers Protocol Buffers ,协议缓冲区。什么是Protocol Buffers呢?或者我们简称PB 吧。那么Protocol Buffers 是一种与语言无关、与平台无关的可扩展机制,用于序列化结构化的数据。 example message Person {optional string nam…...

【模电实验】基尔霍夫定律、叠加定理和戴维南定理验证实验

实验目的 验证基尔霍夫电流定律(KCL)和电压定律(KVL)加深对该定理的理解验证叠加定理,加深对该定理的理解验证戴维南定理,掌握有源二端口网络的开路电压,短路电流和入端等效电阻的测定方法通过实…...

java某百货店POS积分管理系统_积分点更新生成以及通票回收处理

百货店是生活中不可缺少的一部分,为了给顾客提供更方便的服务平台以及更好的服务质量,而设计了POS积分管理系统。百货店通过点积分的管理获得顾客更好的信誉,增加客户流量,获得更多的利益。在百货店经营的过程中,每天的…...

Flutter 常用指令

1.flutter create app_01 &#xff1a;创建一个新的Flutter项目 2.flutter run&#xff1a;运行应用程序 3.flutter run -d <deviceId>&#xff1a;运行指定模拟器或者真机 4.flutter devices&#xff1a;查看计算机上的真机设备和IOS模拟器 5.flutter emulators&…...

定义全局变量property与getprop

authordaisy.skye的博客_CSDN博客-Qt,嵌入式,Linux领域博主 adb调试 adb shell getprop .adb logcat 报错 init: sys_prop: permission denied uid:1006 name:ro.camera.gc02m1 在linux驱动中查找 find ./ -name *.c | xargs grep -n "property_set" find ./ -n…...

双目三维测距(python)

文章目录 1. 双目检测1.1 调用相机1.2 分割画面 2. 双目标定2.1 相机标定2.2 获取参数 3. 双目测距3.1 立体校正3.1.1 校正目的3.1.2 校正方法3.1.2 相关代码 3.2 立体匹配和视差计算3.3 深度计算3.4 注意事项 4. 完整代码 代码打包下载&#xff1a; 链接1&#xff1a;https://…...

数据结构|二叉树的三种遍历方式,你掌握了几种?

目录 1、遍历方式 2、前序遍历 3、中序遍历 1、遍历方式 学习二叉树的结构&#xff0c;最简单的方式就是遍历二叉树。遍历二叉树就是通过某条线路对二叉树的各个结点进行一次访问&#xff0c;访问的方法有三种分为前序遍历、中序遍历、后续遍历&#xff0c;层序遍历它们的遍…...

Direct3D 12——灯光——法向量

a:平面法线着色 b:顶点法线着色 c:像素着色 平面法线&#xff08;face normal,由于在计算机几何学中法线是有方向的向量&#xff0c;所以也有将normal译作法向量&#xff09; 是 一种描述多边形朝向&#xff08;即正交于多边形上所有点&#xff09;的单位向量。 曲面法线&a…...

软考-信息系统工程(五)

信息系统工程 Garlan和Shaw对通用软件架构风格进行了分类&#xff0c;他们将软件架构分为:(曾经考过1分选择题 区分) 数据流风格:数据流风格包括批处理序列和管道/过滤器两种风格。调用/返回风格:调用/返回风格包括主程序/子程序、数据抽象和面向对象&#xff0c;以及层次结构…...

解决谷歌翻译不能使用的问题

今天登录国外网站&#xff0c;发现谷歌翻译已无法正常使用&#xff0c;网上最多的方法就是更改host文件&#xff0c;在host内增加ip地址&#xff0c;但是经常失效&#xff0c;经常手动更改增加ip着实烦恼&#xff0c;还有可能有别的错误。 最终解决方式是&#xff1a;登录GitH…...

Insomnia 简单使用方法

文章目录 1. 新建工程2. 新建若干文件夹3. 设置环境变量4. 授权以及进行请求的链式调用 (chaining requests)4. 1 解决办法 14. 2 解决办法 2 Insomnia 同 Postman&#xff0c; 用于测试后端 endpoint&#xff0c;很容易使用。 使用步骤如下&#xff1a; 1. 新建工程 2. 新建若…...

2023接口自动化测试,完整入门篇

1. 什么是接口测试 顾名思义&#xff0c;接口测试是对系统或组件之间的接口进行测试&#xff0c;主要是校验数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及相互逻辑依赖关系。其中接口协议分为HTTP,WebService,Dubbo,Thrift,Socket等类型&#xff0c;测试类型又主…...

2023年股票代持行业研究报告

第一章 股票代持概述 1.1 基本概念 股票代持&#xff0c;或称委托持股&#xff0c;是指实际出资人与名义出资人达成以下约定&#xff1a;名义出资人作为名义股东&#xff0c;在股东名册等公司工商登记信息上出现&#xff0c;而实际上由实际出资人出资并享有投资权益。 股票代…...

《Netty》从零开始学netty源码(三十九)之PoolSubPage的内存分配

目录 PoolSubPage.allocategetNextAvail方法toHandle方法removeFromPool方法 PoolSubPage.allocate 上一篇我们介绍了PoolSubPage的简单知识&#xff0c;当我们需要PoolSubPage的内存时可调用allocate方法查找可分配二进制的位置&#xff0c;具体的源码过程如下&#xff1a; …...

【目标检测论文阅读笔记】Reducing Label Noise in Anchor-Free Object Detection

&#xff08;Augmentation for small object detection&#xff09; Abstract 当前的 anchor-free无锚目标检测器 将空间上落在真值框预定义中心区域内的所有特征标记为正。这种方法会在训练过程中产生 标签噪声&#xff0c;因为这些 正标记的特征中的一些 可能位于背景或遮挡…...

金融数字新型基础设施创新开放联合体今日成立

4月18日&#xff0c;“金融数字新型基础设施创新开放联合体”&#xff08;以下简称&#xff1a;联合体&#xff09;在上海成立。联合体由上海银行、复旦大学金融科技研究院、中电金信共同发起&#xff0c;首批成员单位汇聚产业链与供给侧的中坚力量&#xff1a;国泰君安证券、太…...

编程语言的发展史

编程语言处在不断的发展和变化中&#xff0c;从最初的机器语言发展到如今的2500种以上的高级语言&#xff0c;每种语言都有其特定的用途和不同的发展轨迹。编程语言并不像人类自然语言发展变化一样的缓慢而又持久&#xff0c;其发展是相当快速的&#xff0c;这主要是计算机硬件…...

巧用千寻位置GNSS软件|点测量采集技巧

点测量是测量中重要的节点&#xff0c;在测量工作的信息处理分析中发挥着重要作用。本期将给各位带来使用千寻位置GNSS软件采集地形点、控制点、快速点、连续点、房角点和倾斜点的操作技巧。 地形点 地形点的设置如图 5.1-9所 示&#xff0c;每次采集一个点&#xff0c;该点需要…...

DHCP原理与配置

目录 一、DHCP工作原理 1&#xff09;了解DHCP服务 使用DHCP的好处 DHCP的分配方式 2&#xff09;DHCP的租约过程 分为四个步骤 二、DHCP服务器的配置 1&#xff09;检查并且安装dhcp有关软件包 2&#xff09;查看系统的配置文件&#xff0c;并且利用好官方给的参考案…...

软件测试今天你被内卷了吗?

认识一个人&#xff0c;大专学历非计算机专业的&#xff0c;是前几年环境好的时候入的行&#xff0c;那时候软件测试的要求真的很低&#xff0c;他那时好像是报了个班&#xff0c;然后入门的&#xff0c;但学的都是些基础&#xff0c;当时的他想的也简单&#xff0c;反正也能拿…...

做完自动化测试,但别让不会汇报毁了你...

pytest 是一个成熟的全功能Python测试工具&#xff0c;可以帮助您编写更好的程序。它与 python 自带的 unittest 测试框架类似&#xff0c;但 pytest 使用起来更简洁和高效&#xff0c;并且兼容 unittest 框架。pytest 能够支持简单的单元测试和复杂的功能测试&#xff0c;pyte…...

企业级信息系统开发讲课笔记2.4 利用MyBatis实现条件查询

文章目录 零、本节学习目标一、查询需求二、打开MyBatisDemo项目三、对学生表实现条件查询&#xff08;一&#xff09;创建学生映射器配置文件&#xff08;二&#xff09;配置学生映射器文件&#xff08;三&#xff09;创建学生映射器接口&#xff08;四&#xff09;测试学生映…...

【天梯赛—不想坑队友系列】L2-003 月饼(java)

目录 第一题&#xff1a; L2-003 月饼 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 题目分析 题目代码 第二题&#xff1a;德才论 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff…...

电磁兼容(EMC)的标准与测试内容

在国际范围上&#xff0c;电磁兼容标准的制定已经有了70多年的发展历程&#xff0c;最早为了保护无线电通信和广播&#xff0c;国际无线电干扰特别委员会&#xff08;CISPR&#xff09;对各种用电设备和系统提出了相关的电磁干扰发射限值和测量方法。到了20世纪60&#xff5e;7…...

滑动平均算法

class Solution { public static int[] maxSlidingWindow(int[] nums, int k) { int right 0; int[] res new int[nums.length -k 1]; int index0; LinkedList<Integer> list new LinkedList<>(); // 开始构造窗口 …...

个人职业发展

职业的本质就是人和社会的交换关系。选择什么职业&#xff0c;等于选择了用什么方式和世界交换。 比如&#xff0c;快递员、小时工靠“体力”&#xff1b;大多数打工者靠“体力智力”&#xff1b;网红靠“资源、平台”&#xff1b;各领域的大神、科学家、艺术家靠“天赋”。 这…...

剑指 Offer 51. 数组中的逆序对

剑指 Offer 51. 数组中的逆序对 难度&#xff1a;hard\color{red}{hard}hard 题目描述 在数组中的两个数字&#xff0c;如果前面一个数字大于后面的数字&#xff0c;则这两个数字组成一个逆序对。输入一个数组&#xff0c;求出这个数组中的逆序对的总数。 示例 1: 输入: [7…...

数字化转型迫在眉睫!药企如何应用AI技术加速创新?

导语 | 近年来&#xff0c;随着 AI 等技术的发展应用&#xff0c;数字化、智能化日渐成为各行各业转型升级的新兴力量&#xff0c;其与医药产业的融合创新也逐渐成为当前的新趋势&#xff0c;众多医药制造企业蓄势待发&#xff0c;搭乘数字化的快车&#xff0c;驶入高速发展的快…...

电脑显示屏是怎么显示出图像的?CPU与GPU又是什么关系?

文章目录电脑显示屏是怎么显示出图像的&#xff1f;CPU与GPU又是什么关系&#xff1f;显卡作用明明有了CPU为什么还要GPU?电脑显示屏是怎么显示出图像的&#xff1f;内存与显存所有运算都交给GPU处理可以吗&#xff1f;参考&#xff1a;电脑显示屏是怎么显示出图像的&#xff…...

报名截至在即 | “泰迪杯”挑战赛最后一场赛前指导直播!

为推广我国高校数据挖掘实践教学&#xff0c;培养学生数据挖掘的应用和创新能力&#xff0c;增加校企交流合作和信息共享&#xff0c;提升我国高校的教学质量和企业的竞争能力&#xff0c;第十一届“泰迪杯”数据挖掘挑战赛&#xff08;以下简称挑战赛&#xff09;已于2023年3月…...