关于protocol-buffer:Protocol-Buffers-系列-3-proto2-proto语法指南

本文介绍如何应用Protocol Buffers语言来结构协定缓冲区数据,包含.proto文件语法以及如何从 .proto文件生成数据拜访类。它涵盖了proto2版本的协定缓冲区语言。 本文只是一个参考指南,后续会出Java语言的教程。如何应用本指南?在工作中遇到时,通过查问关键字来查找须要的知识点。 定义一个Message类型首先咱们开始为一个简略的例子,如果咱们要构建一个搜寻的申请音讯格局。每个搜寻的音讯包含三个参数: 要查问的字符串指定的页码以及后果数上面则就是这个.proto对应的message格局 message SearchRequest { required string query = 1; optional int32 page_number = 2; optional int32 result_per_page = 3;}SearchRequest音讯定义指定了三个字段(也可称为名称或者键值对),每个字段都有一个名称和一个类型。 指定的字段类型下面的例子中,能够看到有两个类型:两个整数(页码和每页后果数量)、字符串(查问条件)。当然,咱们也能够定义字段为复合类型,包含枚举和其余的音讯类型。 调配字段编号下面的例子中,能够看到每个字段都有一个举世无双的编号,这些编号用于在二进制音讯中标识咱们的字段,也就是相当于字段的别名。1 ~ 15 范畴内的字段应用的是一个字节来示意。16 ~ 2047 范畴内的字段应用两个字节来示意。所以,为了晋升性能,咱们尽可能的将呈现十分频繁的字段保留到1~15的范畴中。 最小的编号是1,最大的编号是2^29 - 1,也就是536,870,911。留神,不能应用数字 19000 到 19999,因为它们是为协定缓冲区实现保留的 - 如果在 .proto 中应用这些保留数字之一,协定缓冲区编译器会报错。同一个音讯内的编号不能反复,这个也是须要留神的。 指定字段规定required:简略了解为必选字段,数量为1。optional:可抉择的,数量不超过1。repeated:所润饰的字段能够任意次数反复,包含0次。反复值的程序也会被记录。因为历史起因,标量数字类型的反复字段(例如,int32、int64、enum)的编码效率没有达到应有的程度。新代码应该应用非凡选项[packed=true]来取得更高效的编码。例如: repeated int32 samples = 4 [packed = true];repeated ProtoEnum results = 5 [packed = true];packed为压缩字段,这个在后续的文章会解说。required也就象征了forever,因而咱们在设置字段时,须要尽可能的多去考虑一下字段的作用范畴。 增加更多的音讯类型咱们能够在一个.proto文件中,设置多个音讯类型。 message SearchRequest { required string query = 1; optional int32 page_number = 2; optional int32 result_per_page = 3;}message SearchResponse { ...}尽管能够在单个 .proto 文件中定义多种音讯类型(例如音讯、枚举和服务),但在单个文件中定义大量具备不同依赖关系的音讯时,也会导致依赖关系收缩。官网倡议在每个 .proto 文件中蕴含尽可能少的音讯类型,然而这个数值并为给出具体范畴,须要依据理论状况评定。保留字段当咱们在更新音讯构造时,删除了某个字段或者正文掉了某个字段,未来的某一个用户能够应用咱们删除了的这个字段对应的编号,这是没有问题的。然而一旦在前期加载到了.proto批改前的旧版本,就会因为编号抵触而产生问题,导致数据错乱的状况,因而能够引入保留字段。 ...

May 9, 2022 · 3 min · jiezi

关于protocol-buffer:Protocol-Buffers-系列-1-什么是Protocol-Buffers

什么是Protocol Buffers?Protocol Buffers(协定缓冲区)是一种反对多语言、跨平台、可扩大的机制,用于序列化构造数据格式。相比于XML, JSON, YAML, CSV等一些序列化工具,Protocol Buffers更简略、更快、更轻量。咱们只需依照咱们的志愿定义一次数据的构造(message),就能够应用非凡生成的代码(能够通过命令行,能够通过Maven插件),轻松地在各种数据流和各种语言之间写入和读取咱们的结构化数据。 Protocol Buffers解决了什么问题?Protocol Buffers为大小高达几M字节的结构化数据包提供序列化格局。通过将 结构化的数据 进行 串行化(序列化),从而实现 数据存储 / RPC 数据交换的性能。Protocol Buffers能够应用新信息进行扩大,而不会使现有数据有效或要求更新代码。 序列化: 将 数据结构或对象 转换成 二进制串 的过程反序列化:将在序列化过程中所生成的二进制串 转换成 数据结构或者对象 的过程Protocol Buffers是 Google 最罕用的数据格式。通过.proto后缀的文件,来编写Protocol Buffers音讯以及服务。上面显示了一个示例音讯: message Person { optional string name = 1; optional int32 id = 2; optional string email = 3;}proto 编译器在 .proto 文件构建时被调用,以生成各种编程语言的代码来操作相应的Protocol Buffers。每个生成的类都蕴含每个字段的简略拜访器和办法,用于将整个构造序列化和解析为原始字节。上面展现了一个应用这些生成办法的示例: Person john = Person.newBuilder() .setId(1234) .setName("John Doe") .setEmail("jdoe@example.com") .build();output = new FileOutputStream(args[0]);john.writeTo(output);Protocol Buffers的长处Protocol Buffers非常适合任何须要以与语言无关、与平台无关、可扩大的形式进行序列化结构化数据的状况。它们通常用于定义通信协议(与gRPC一起)和数据存储。 跨语言的兼容性目前Google官网反对C++、C#、Java、Kotlin、PHP、Python、Ruby等,其余的能够在github上找到,反对插件的形式。 跨我的项目反对通过在.proto文件中自定义message,咱们能够跨我的项目应用Protocol Buffers,同时能够将文件搁置在我的项目的代码库之外,比方能够和Java文件夹同目录。如果咱们冀望定义将在间接团队之外宽泛应用的音讯类型或枚举时,咱们能够将它们放在本人的文件中,而不依赖它们。 ...

May 9, 2022 · 1 min · jiezi