protobuf的复杂结构

简介: protobuf的复杂结构

前言

在写proto文件的时候,想要百度一下都有哪些内容,但是找到的都是那个经典的官方样例,互相之间抄来抄去,所以这里干脆把git上的相关源码,和实际使用经历结合总结下来,给一潭死水里注入一点活力吧。

常用关键字

1. syntax:指定proto文件使用的语法版本。
2. package:指定生成的代码所在的包名。
3. import:导入其他proto文件。
4. option:设置特定的选项。
5. message:定义消息类型。
6. enum:定义枚举类型。
7. service:定义服务接口。
8. rpc:定义远程过程调用方法。
9. oneof:定义互斥字段,只能选择其中一个字段。
10. map:定义映射类型,类似于字典。
11. repeated:定义重复字段,可以有多个值。
12. required:定义必需字段,必须有值。
13. optional:定义可选字段,可以有值也可以为空。
14. extensions:定义扩展字段。
15. extend:扩展已有的消息类型或枚举类型。

每个关键字的使用示例

  1. syntax:
syntax = "proto3";
  1. package:
package mypackage;
  1. import:
import "google/protobuf/timestamp.proto";
  1. option:
option java_package = "com.example.mypackage";
  1. message:
message Person {
  string name = 1;
  int32 age = 2;
  repeated string phone_numbers = 3;
}
  1. enum:
enum PhoneType {
  MOBILE = 0;
  HOME = 1;
  WORK = 2;
}
  1. service:
service MyService {
  rpc GetData (GetDataRequest) returns (GetDataResponse);
}
  1. rpc:
rpc GetData (GetDataRequest) returns (GetDataResponse);
  1. oneof:
message Person {
  string name = 1;
  oneof phone_number {
    string mobile = 2;
    string home = 3;
    string work = 4;
  }
}


  1. map:
message Person {
  string name = 1;
  map<string, string> phone_numbers = 2;
}
  1. repeated:
message Person {
  string name = 1;
  repeated string phone_numbers = 2;
}
  1. required:
required:
  1. optional:
message Person {
  optional string name = 1;
  optional int32 age = 2;
}
  1. extensions:
extend Person {
  extensions 100 to 199;
  optional string email_address = 100;
}
  1. extend:
extend google.protobuf.Timestamp {
  optional string timezone = 1000;
}

复杂结构

下面是一些示例,展示了proto文件中的嵌套、数组和以结构体为值的映射的用法:

  1. 嵌套示例:
syntax = "proto3";

message Address {
  string street = 1;
  string city = 2;
  string state = 3;
}

message Person {
  string name = 1;
  int32 age = 2;
  Address address = 3;
}

在上面的示例中,Address是一个嵌套在Person中的消息类型。

  1. 数组示例:
syntax = "proto3";

message Person {
  string name = 1;
  repeated string phone_numbers = 2;
}

在上面的示例中,phone_numbers字段是一个字符串数组。

  1. 以结构体为值的映射示例:
syntax = "proto3";

message Person {
  string name = 1;
  map<string, Address> addresses = 2;
}

message Address {
  string street = 1;
  string city = 2;
  string state = 3;
}

在上面的示例中,addresses字段是一个以字符串为键、Address结构体为值的映射。

  1. 自定义枚举值:
syntax = "proto3";

enum PhoneType {
  MOBILE = 0;
  HOME = 1;
  WORK = 2;
  CUSTOM = 3;
}

在上面的示例中,我们定义了一个自定义的枚举值CUSTOM。

  1. 扩展字段:
syntax = "proto3";

message Person {
  string name = 1;
  extensions 100 to 199;
}

extend Person {
  optional string email = 100;
}

在上面的示例中,我们使用extend关键字扩展了Person消息类型,添加了一个可选的email字段。

  1. 服务定义和RPC方法:
syntax = "proto3";

service MyService {
  rpc GetData (GetDataRequest) returns (GetDataResponse);
  rpc UpdateData (UpdateDataRequest) returns (UpdateDataResponse);
}

message GetDataRequest {
  string id = 1;
}

message GetDataResponse {
  string data = 1;
}

message UpdateDataRequest {
  string id = 1;
  string newData = 2;
}

message UpdateDataResponse {
  bool success = 1;
}

上面的示例中,我们定义了一个名为MyService的服务,其中包含了两个RPC方法:GetData和UpdateData。每个RPC方法都有对应的请求消息和响应消息。


分享一个有趣的 学习链接:https://xxetb.xet.tech/s/HY8za



目录
相关文章
|
存储 弹性计算 NoSQL
libcuckoo论文概述
本文简要阐述libcuckoo项目的两篇论文基础。如有错漏之处,欢迎指出一起讨论交流。 ## 论文1 《MemC3: Compact and Concurrent MemCache with Dumber Caching and Smarter Hashing》 这篇论文主要讲了在多线程模式下如何提升cuckoo hash table的吞吐。 ### 问题 传统hash表在并发效率上并不
2016 0
libcuckoo论文概述
|
10月前
|
测试技术 计算机视觉 Python
使用 PyAutoGUI 进行屏幕截图并裁剪图片
PyAutoGUI 是一个用于自动化鼠标和键盘操作的 Python 库,支持屏幕截图。结合 Pillow 库,可以实现屏幕截图的裁剪。本文介绍如何使用这两个库截取屏幕区域并裁剪图像,包括安装库、截取屏幕、保存图片、裁剪图片的完整示例代码。
611 2
|
11月前
|
机器学习/深度学习 数据采集 人工智能
智能化运维:AI在IT运维中的应用探索###
随着信息技术的飞速发展,传统的IT运维模式正面临着前所未有的挑战。本文旨在探讨人工智能(AI)技术如何赋能IT运维,通过智能化手段提升运维效率、降低故障率,并为企业带来更加稳定高效的服务体验。我们将从AI运维的概念入手,深入分析其在故障预测、异常检测、自动化处理等方面的应用实践,以及面临的挑战与未来发展趋势。 ###
|
机器人 测试技术 C++
ModbusCRC16校验 示例代码
本文提供了ModbusCRC16校验的示例代码,包括计算CRC、添加CRC校验位、删除CRC校验位和比较CRC校验位等四种常用函数的实现,以及一个完整的示例代码。这些代码在Ubuntu20.04环境下经过测试并确认有效。示例代码采用C++编写,展示了如何使用这些函数来处理Modbus通信中的数据校验。
602 2
|
自然语言处理 算法 测试技术
【C/C++ CommonAPI入门篇】从 Franca IDL 到 C++: 深入解析汽车软件接口开发
【C/C++ CommonAPI入门篇】从 Franca IDL 到 C++: 深入解析汽车软件接口开发
740 1
|
XML 安全 Java
【分布式技术专题】「单点登录技术架构」一文带领你好好对接对应的Okta单点登录实现接口服务的实现落地
【分布式技术专题】「单点登录技术架构」一文带领你好好对接对应的Okta单点登录实现接口服务的实现落地
682 0
|
MySQL 关系型数据库 存储
【MySQL】 DATE_FORMAT() 格式化时间
【MySQL】 DATE_FORMAT() 格式化时间 我们会在项目中遇到这样一种需要,时间存储的时候存的是datetime,也就是年月日,时分秒,但是我们在使用的时候只需要使用年月日的时间,如果我们查询出成千上万条数据,使用代码转化可能会降低效率以及使得代码变得更加繁琐,这时候我们可以考虑在数据源就将其转化。
9089 0
|
消息中间件 关系型数据库 MySQL
测试神器之MeterSphere
测试神器之MeterSphere
377 0
|
C++
C++17使用std::apply和fold expression对tuple进行遍历
C++17使用std::apply和fold expression对std::tuple进行遍历
213 0
|
前端开发 定位技术
react中使用百度地图报错:‘BMapGL‘ is not defined no-undef解决方法
react中使用百度地图报错:‘BMapGL‘ is not defined no-undef解决方法