Protobuf 3 定义复杂的proto文件

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
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在 protobuf 中,可以使用嵌套消息类型来定义复杂的消息类型。例如,一个包含订单信息的消息类型可以被定义为: ``` syntax = "proto3"; message Order { string order_id = 1; repeated Item items = 2; Shipping shipping = 3; } message Item { string name = 1; int32 quantity = 2; float price = 3; } message Shipping { string address = 1; string city = 2; string state = 3; string zip_code = 4; } ``` 在上面的例子中,Order 消息类型包含了一个字符串类型的订单 ID(order_id),一个 Item 消息类型的重复字段(items),以及一个 Shipping 消息类型的 shipping 字段。Item 消息类型包含了商品名称(name)、数量(quantity)和价格(price)字段。Shipping 消息类型包含了地址(address)、城市(city)、州(state)和邮政编码(zip_code)字段。 通过使用嵌套消息类型,可以轻松地定义复杂的消息类型,并且可以更好地组织数据结构,使其更易于维护和扩展。 ### 回答2: proto文件是Google开发的一种用于定义消息类型的语言。它可以帮助开发者在不同的平台和语言之间进行通信和数据交换。proto文件定义复杂消息类型,使开发者可以在应用程序中定义自己的数据结构和消息格式。 在proto文件中,开发者可以定义各种数据类型,包括基本数据类型如整型、浮点型、布尔型,以及复杂数据类型如枚举、结构体等。通过定义这些数据类型,开发者可以根据自己的需求来创建各种复杂的消息类型。 使用proto文件定义复杂消息类型的好处是,它使得数据的传输和解析变得简单和可靠。proto文件中的消息类型可以被不同的编程语言自动转换为对应的数据结构,使得不同语言的应用程序可以直接交互和通信,而无需手动实现数据的序列化和反序列化。 另外,proto文件还支持消息类型的继承和嵌套,这使得开发者可以方便地定义复杂的数据结构和消息类型。开发者可以通过继承机制来扩展已有的消息类型,也可以通过嵌套消息类型来定义复杂的数据结构,进而满足不同应用场景的需求。 总之,proto文件是一种定义消息类型的强大工具,它可以帮助开发者定义复杂的数据结构和消息类型,实现不同应用程序之间的数据交换和通信。同时,它还提供了跨平台和跨语言的支持,使得开发更加简单和高效。 ### 回答3: proto文件是Google开发的一种用于定义和序列化结构化数据的语言。它可以用来定义复杂的消息类型,以便在不同的计算机系统之间进行数据交换。 在proto文件中,我们可以定义不同的数据类型,包括基本数据类型(如整型、浮点型、布尔型等)以及复杂数据类型(如消息、枚举等)。对于复杂数据类型,我们可以使用嵌套的方式定义多层次的消息结构,从而构建出具有复杂关系和功能的消息类型。 通过proto文件定义复杂消息类型,我们可以明确指定消息中的字段名称、类型和顺序,并可以选择性地添加字段的标记和选项。这样,在数据交换过程中,发送方和接收方可以根据proto文件定义,准确地解析和处理消息,确保数据的一致性和准确性。 proto文件还支持使用扩展语法来定义可选的字段和特定领域(如自定义选项或插件)中的消息类型。这使得我们可以根据实际需求对消息进行灵活的定制,进一步增强了proto文件定义复杂消息类型的能力。 总之,通过proto文件定义复杂消息类型可以提供清晰明确的消息结构和定义,并且具有良好的跨平台和跨语言的兼容性。这让数据交换更加简单高效,从而提高了系统的可扩展性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值