如何在Protobuf中定义数组?服务器需接收[{"name":"ada","age":"20"}]格式的数组输入,求Protobuf定义方案
如何在Protobuf中定义数组格式的输入(如[{"name":"ada","age":"20"}])
嘿,这个问题其实挺常见的,我来给你捋清楚怎么在Protobuf里实现这种数组格式的输入~
首先你要知道,在Protobuf的语法里,数组/列表结构对应的是repeated关键字,用来表示重复的消息类型。你的示例是一个包含多个用户对象的数组,我们可以分两步来完成定义:
1. 先定义数组里的单个元素消息
把你示例中的单个用户对象(比如{"name":"ada","age":"20"})定义成一个独立的Protobuf消息:
syntax = "proto3"; // 单个用户对象,对应示例里的每个元素 message Person { string name = 1; // 字段编号1,对应name属性 string age = 2; // 字段编号2,对应age属性(如果你的age是数字类型,建议改成int32/int64更高效) }
2. 定义包含数组的请求消息(或直接在服务接口中使用)
接下来要让服务器接收这个数组,有两种常用方式:
方式一:封装成专门的请求消息
最规范的做法是定义一个请求消息,里面用repeated字段来承载数组:
// 接收用户数组的请求消息 message PersonListRequest { repeated Person persons = 1; // repeated关键字表示这是Person类型的数组 }
方式二:在gRPC服务接口中直接使用(如果用gRPC的话)
如果你是用gRPC搭建服务,可以直接在服务方法的参数里使用repeated Person,不过更推荐用上面的封装请求消息:
service UserService { // 批量处理用户的接口,接收用户数组请求 rpc BatchProcessUsers (PersonListRequest) returns (ProcessResponse); } // 响应消息示例 message ProcessResponse { bool success = 1; string message = 2; }
生成代码后的使用示例(以Python为例)
用protoc生成对应语言的代码后,你可以这样构造符合要求的输入:
import example_pb2 # 创建单个用户对象 person_ada = example_pb2.Person(name="ada", age="20") person_bob = example_pb2.Person(name="bob", age="25") # 构造包含数组的请求 request = example_pb2.PersonListRequest() request.persons.extend([person_ada, person_bob]) # 之后就可以把这个request发送给服务器处理啦
几个小提醒
- Protobuf里的字段编号(比如
string name = 1里的1)是序列化的关键,不能重复,也不要随便修改已发布的字段编号。 - 如果你的
age实际是数字值,一定要把字段类型改成int32或int64,比用string更节省空间、更高效。 - 在Protobuf 3中,
repeated字段默认是压缩打包的,不需要额外加[packed=true],旧版本可能需要手动指定。
内容的提问来源于stack exchange,提问作者rongH chen
相关产品推荐
相关产品推荐

