protobuf 是谷歌的语言无关,平台无关,可扩展的,高效的结构化数据序列化机制,比xml和json的序列化的速度更快,此处记录一下 proto3 的语法,防止以后忘记。
注意:proto3 语法需要注意的事项,见下方代码中的注释
syntax = "proto3"; // 定义这个文件的语法是proto3、默认情况下是proto2 这个指定语法行必须是文件的非空非注释的第一个行。 // 申明一个包 package com.huan.proto; option java_package = "com.huan.proto"; // 申明一个在 java 中使用的包,如果没有申明这个,则使用外层的 package 申明 option java_outer_classname = "PersonWrapper"; // 表示最后生成java的类名 // 定义一个消息体 // 1、下方每个字段后后面都有一个唯一的标识符,1,2,3,4....,这些标识符是用来在消息的二进制的识别各个字段的,一段开始使用就不可再次改变。 // 2、其中[1,15]的标识符在编码的时候会占一个字节,[16,2047]的标识符会占2个字节,因此我们应该为常用的字段的标识符在[1,15]之内。[19000-19999]为预留的标识符不可使用 // 默认值 // 1、对于strings,默认是一个空string // 2、对于bytes,默认是一个空的bytes // 3、对于bools,默认是false // 4、对于数值类型,默认是0 // 5、对于枚举,默认是第一个定义的枚举值,必须为0; // 6、对于消息类型(message),域没有被设置,确切的消息是根据语言确定的, message Person { // 对应 java 中的 String 数据类型 string personName = 1; // 对应 java 中的 int 数据类型 int32 age = 2; // 对应 java 中的 double 数据类型 double salary = 3; // 对应 java 中的 float 数据类型 float weight = 4; // 对应 java 中的 boolean 数据类型 bool isMarry = 5; // 对应 java 中的 long 数据类型 sint64 createTime = 6; // 对应 java 中的 byte 数据类型 bytes content = 7; // 对应 java 中的 枚举 数据类型 SexEnum sex = 8; // 对应 java 中的 List 集合 repeated string friends = 9; // 对应 java 中的 map 类型 [deprecated = true]表示这个字段已经被废弃了 map<string, string> ext = 10 [deprecated = true]; // 定义一个枚举,不建议在枚举中使用负数,因为枚举值是采用可变编码方式的。 enum SexEnum { option allow_alias = true; // 当打开这个配置时,可以实现将不同的枚举常量指定为相同的值,比如下方的 WOMEN和NOT_KONWN MAN = 0; // 在枚举中,第一个值必须是 0 WOMEN = 1; NOT_KNOWN = 1; } // oneof 表示的字段中,表示只有一个字段有值,那么在此处OnlyOneFieldHasValue下的三个字段同一时刻,只有一个字段有值,如果多次赋值,那么后面的值会覆盖前面的值 oneof OnlyOneFieldHasValue { string username = 11; Person person = 12; SexEnum personSex = 13; } // reserved 标识的为保留字段,标识不可用,比如前期使用了数字 10,但是现在删除了,后期别人不知道又使用了数字10,那么这个时候是有问题的,应该预留出来,表示不可用 reserved 30, 20, 21; reserved "could not use field", "myFirends"; } // 定义一个查询的消息体 message SearchRequest { string username = 1; } // 定义一个RPC服务 service PersonService { // 定义rpc方法 rpc findPerson1 (SearchRequest) returns (Person); rpc findPerson2 (stream SearchRequest) returns (Person); rpc findPerson3 (SearchRequest) returns (stream Person); rpc findPerson4 (stream SearchRequest) returns (stream Person); } // 有了以上 proto 文件,如何生成对应的 java 代码 // protoc --proto_path=import_path_dir --java_out=java_file_out_put_dir path/to/dest_proto_file.proto // proto_path:表示使用了 import 后,import 的 proto文件所在的目录。如果忽略该值,那么默认是当前目录,如果存在多个目录可以多次使用 --proto_path // java_out:表示在这个目录中生成java代码 // path/to/dest_proto_file.proto:表示我们需要生成的proto文件所在的位置
有了以上proto文件,那么如何生成 java 代码呢?
语法:protoc --proto_path=为import命令时proto文件所在的路径,如果存在多个,可以写多个--proto_path --java_out=表示生成的java文件的路径 然后接需要生成proto文件的路径。
举例:
需要引入的jar包依赖:
<dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.6.1</version> </dependency>
proto编译器下载地址:
https://github.com/protocolbuffers/protobuf/releases/tag/v3.6.1
相关推荐
1. **兼容性问题**:protobuf3与之前的proto2存在兼容性问题,特别是在某些语法特性上,开发者需要了解这些差异以避免潜在问题。 2. **消息类型定义**:消息类型通过`.proto`文件定义,例如`SearchRequest`消息包含...
仅支持proto3语法。 如果您需要proto2语法支持,请提交问题和/或提交 PR。 ProtoPoet 有一个完整记录的 API,请参阅 了解更多详细信息,或继续阅读以查看使用此 API 的一些快速示例。 定义简单消息 假设我们想声明一...
3. **可扩展性**:可以通过增加、修改或删除.proto文件中的字段来扩展或更新数据结构,不影响旧版本的兼容性。 4. **跨平台支持**:protobuf支持多种编程语言,使得数据交换可以在不同平台和语言之间无缝进行。 **...
SQL语句主要包括SELECT用于查询,INSERT用于插入新记录,UPDATE用于修改现有记录,DELETE用于删除记录。此外,SQL还涉及表的创建、索引、视图、存储过程以及事务处理等高级功能。 在学习这些语法时,建议从基础概念...
JavaScript的原型基于原型链机制,每个对象都有一个__proto__属性,指向其构造函数的原型对象。通过原型,对象可以继承另一对象的属性和方法。ES6引入的类(class)语法,实际上是对原型继承的一种语法糖。 六、...
- **方法和属性**:`__proto__`和`prototype`用于原型链,`Object.create()`创建新对象并指定其原型。 6. **数组** - **创建数组**:`[]`字面量或`new Array()`构造函数。 - **数组方法**:`push()`, `pop()`, `...
1. **proto3语法**:这是protobuf的一个新语法版本,移除了某些在proto2中使用的特性,如默认值和optional/required/optional字段语义,使得语法更简洁。 2. **更强的互操作性**:增强了与其他语言的兼容性和互操作...
syntax = "proto3"; message Person { string name = 1; int32 id = 2; string email = 3; } ``` 这段代码定义了一个名为`Person`的消息类型,包含三个字段:`name`(字符串)、`id`(整数)和`email`(字符串...
- ** proto3语法**:引入新的语法,移除了某些在proto2中的特性,如默认值、required字段等,简化了语法。 - **更强的互操作性**:支持更多的数据类型,增强了不同语言间代码的互操作性。 - **更好的性能**:优化了...
在实际应用中,protobuf常用于服务器之间的RPC(远程过程调用)、游戏数据存储、配置文件格式、日志记录等多种场景。通过protobuf,开发者可以实现跨平台、跨语言的数据交换,提升系统间的通信效率和代码可维护性。...
- `access_time`或`@timestamp`记录了日志生成和存储的时间戳。 - `sip`和`sport`分别表示源IP和源端口,它们定义了数据流的发起方。 - `dip`和`dport`是目的IP和目的端口,标识了数据流的目标。 - `proto`是协议...
标题中的"time_proto.zip_Help!_arduino_cpp6979_cpp6979车啪_globe4nf"可能指的是一个包含时间处理协议或库的压缩文件,用户在使用Arduino编程时遇到了问题,可能是关于cpp6979(可能是错误代码或自定义库名)和...
2. 在命令行中运行工具,传入需要合并的protobuf文件路径,如:`npx protobuf-merge -o combined.proto file1.proto file2.proto ...`,`-o`参数指定输出的合并后文件名。 3. 工具会读取所有输入文件,并将它们合并...
为了使用protobuf,开发者需要对.proto文件的语法有深入理解,知道如何定义消息类型和枚举,以及如何使用编译器生成相应语言的代码。同时,了解protobuf的序列化和反序列化机制也是至关重要的。在实际开发中,掌握...
在JavaScript中,学习和掌握原型链、构造函数、原型对象以及`Object.create()`、`class`语法等知识点,对于理解类似`Amzl_Proto`这样的项目至关重要。此外,熟悉模块系统(如CommonJS、ES6模块)和构建工具(如...
3. **query-reflection.proto** - 可能与数据库查询的反射机制有关,这可能涉及到SQL查询的解析、优化或执行计划的表示。这种反射机制有助于动态适应不同的查询需求。 4. **iceberg.proto** - Iceberg是一个云原生...
3. **编译器工具**:Google提供了`protoc`编译器,它可以将.proto文件转换为特定语言(如Erlang、Java、C++等)的源代码,这些源代码包含消息类或记录的定义,方便在代码中使用。 **二、Erlang Protobuffs的使用...
- **更简单的语法**:protobuf 3.5简化了.proto文件的语法,使得代码更易读写,例如,取消了`package`关键字前的`option`。 - **支持JSON格式**:提供了与JSON之间的互转功能,方便与Web服务交互。 - **增强的API...
1. **定义数据结构**:使用protobuf的语法(.proto文件)定义消息类型。例如: ```proto syntax = "proto3"; message Person { string name = 1; int32 id = 2; string email = 3; } ``` 2. **编译.proto...
protobuf的核心在于定义数据结构的.proto文件,这种文件采用类似于IDL(接口定义语言)的语法,允许开发者声明消息类型和字段。通过protobuf编译器protoc,我们可以将这些.proto文件转换为多种编程语言(如C++、Java...