Protobuf 3 定义复杂的proto文件

本文深入解析Protobuf中如何定义复杂对象,包括List、枚举、Any、Map及预留字段的使用,同时提供了一个完整的proto文件示例,并附上了Protobuf数据类型与Java变量的对应关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. proto文件

除了定义string, int等基础对象外(protobuf的基础数据结构和Java变量的对应关系见文章末尾),还可以在proto中定义更复杂的对象,详细如下:

  1. 定义List列表:
    值可以是普通变量,也可以复杂对象。
message ComplexObject {
   repeated string sons = 4; // List列表
   repeated Result result = 6; // 复杂的对象List
}

// 定义一个新的对象
message Result {
  string url = 1;
  string title = 2;
  repeated string snippets = 3;
}
  1. 定义枚举成员
message ComplexObject {
    ...
    Gender gender = 5; // Enum值
    ...
}
enum Gender {
  MAN = 0;
  WOMAN = 1;
}
  1. 定义Any对象:
    用于定义任意的值
message ComplexObject {
   repeated google.protobuf.Any any = 7; // Any对象
}
  1. 定义Map对象:
    key,value都可以是复杂对象
message ComplexObject {
   map<string, MapVaule> map = 8; // 定义Map对象
}
// 定义Map的value值
message MapVaule {
  string mapValue = 1;
}
  1. 通过 reserved保留 Assigning Tags和filed name用于将来扩展用
message ComplexObject {

    reserved 12, 15, 9 to 11; // 预留将来使用的Assigning Tags,
    reserved "foo", "bar"; // 预留将来使用的filed name
}

完整proto文件:

// 如果使用此注释,则使用proto3; 否则使用proto2
syntax = "proto3";

// 引入外部的proto对象
import "google/protobuf/any.proto";

// 生成类的包名
option java_package = "com.hry.spring.proto.complex";
//生成的数据访问类的类名  
option java_outer_classname = "MyComplexObjectEntity";

message ComplexObject {  
    // Message里每个成员变量都有一个唯一的数字标志(   Assigning Tags)
    int32 id = 1;//  singular, 默认值,表示成员只有0个或者1个
    string name = 2;// 
    string email = 3;//
    repeated string sons = 4; // repeated 列表
    Gender gender = 5; // Enum值
    repeated Result result = 6; // 新的对象List
    repeated google.protobuf.Any any = 7; // Any对象
    map<string, MapVaule> map = 8; // 定义Map对象

    // reserved
    reserved 12, 15, 9 to 11; // 预留将来使用的Assigning Tags,
    reserved "foo", "bar"; // 预留将来使用的filed name
} 

enum Gender {
  MAN = 0;
  WOMAN = 1;
}

// 定义一个新的对象
message Result {
  string url = 1;
  string title = 2;
  repeated string snippets = 3;
}

// 定义Map的value值
message MapVaule {
  string mapValue = 1;
}

2. protobuf的基础数据结构和Java变量的对应关系

在这里插入图片描述


转自:https://blog.csdn.net/hry2015/article/details/70766603
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值