如何用Protobuf消息表示对象数组?是否必须采用嵌套方式实现?
如何用Protobuf表示对象数组
你尝试的第一种写法是完全不可行的,Protobuf的语法规则不允许直接用repeated message来定义类型。
为什么你的伪代码无效?
在Protobuf中,repeated是字段修饰符,只能用来标记某个字段是数组/列表类型,不能直接用来定义消息本身。你写的repeated message Response { ...Entry; }完全不符合语法规范,Protobuf编译器根本无法识别这种写法。
正确的实现方式
你提到的第二种嵌套写法才是Protobuf中表示对象数组的标准做法,也是唯一合规的方式:
syntax = "proto3"; // 定义单个对象的消息结构 message Entry { string firstKey = 1; string secondKey = 2; } // 用一个顶层消息包裹数组字段 message Response { repeated Entry data = 1; // repeated修饰Entry类型字段,代表这是Entry对象的数组 }
对应JSON结构说明
当你把这个Protobuf消息序列化为JSON时,会得到类似这样的结构:
{ "data": [ {"firstKey": "firstValue", "secondKey": "secondValue"}, {"firstKey": "firstValue", "secondKey": "secondValue"} ] }
这和你想要的数组结构几乎一致,只是多了一层data键——这是因为Protobuf要求所有序列化内容必须是一个完整的消息,不能直接以数组作为顶层结构,所以必须用一个消息来包裹你的数组字段。
内容的提问来源于stack exchange,提问作者Bartek Maciejiczek
相关产品推荐
相关产品推荐

