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



目录
相关文章
|
9月前
|
编解码 Java 编译器
【Protobuf】Protobuf中的Message语法规范
在Message中定义一个或者多个字段,FieldType是字段的数据类型,可以是基本类型(如int32、string、bool等)或其他定义的Message类型。fieldName是字段的名称,可以根据需求自定义。fieldNumber是字段的唯一标识号,用于在消息的二进制编码中标识字段。
234 0
|
2月前
|
存储 XML JSON
protobuf原理以及实例(Varint编码)
protobuf原理以及实例(Varint编码)
75 0
|
2月前
|
存储 Java Go
|
2月前
|
存储 XML JSON
日常小知识点之序列化结构(protobuf使用及简单原理)
日常小知识点之序列化结构(protobuf使用及简单原理)
104 0
|
8月前
|
C++ 容器
使用protobuf的简单流程记录、编译protobuf时遇到的坑 以及 链接protobuf的坑
使用protobuf的简单流程记录、编译protobuf时遇到的坑 以及 链接protobuf的坑
142 0
|
8月前
|
存储
protobuf中的Base 128 Varints类型分析
protobuf中的Base 128 Varints类型分析
66 0
|
编解码 JSON 安全
IM通讯协议专题学习(四):从Base64到Protobuf,详解Protobuf的数据编码原理
本篇将从Base64再到Base128编码,带你一起从底层来理解Protobuf的数据编码原理。 本文结构总体与 Protobuf 官方文档相似,不少内容也来自官方文档,并在官方文档的基础上添加作者理解的内容(确保不那么枯燥),如有出入请以官方文档为准。
337 0
IM通讯协议专题学习(四):从Base64到Protobuf,详解Protobuf的数据编码原理
|
SQL 存储 Java
Java序列化案例demo(包含Kryo、JDK原生、Protobuf、ProtoStuff以及hessian)(一)
Java序列化案例demo(包含Kryo、JDK原生、Protobuf、ProtoStuff以及hessian)(一)
Java序列化案例demo(包含Kryo、JDK原生、Protobuf、ProtoStuff以及hessian)(一)
|
Dubbo 算法 安全
Java序列化案例demo(包含Kryo、JDK原生、Protobuf、ProtoStuff以及hessian)(二)
Java序列化案例demo(包含Kryo、JDK原生、Protobuf、ProtoStuff以及hessian)(二)
Java序列化案例demo(包含Kryo、JDK原生、Protobuf、ProtoStuff以及hessian)(二)