protobuf repeated详解

发布时间:2023-05-22

一、简介

Protobuf是一种由谷歌开发的语言无关、平台无关、可扩展的数据序列化格式,其重要特征是用简单的模式描述多种数据类型,并且可以在不同的平台上进行数据交换。protobuf repeated是其中的一种特性,用于表示重复出现的字段。

二、基本用法

Repeated字段支持的类型包括基本类型(int32、uint32、sint32、fixed32、sfixed32、int64、uint64、sint64、fixed64、sfixed64、float、double、bool、string、bytes)以及其他消息类型。使用repeated关键词定义数组类型:

syntax = "proto2";
message Person {
  repeated string phone_number = 1;
}

在上面的例子中,定义了一个名为Person的消息类型,其中phone_number字段是一个字符串数组。在具体使用时,可以像操作普通的数组一样对其进行访问和修改:

Person.AddressBook address_book = ...
Person.Person john = address_book.person.add();
john.name = "John Doe";
john.id = 1234;
john.email = "jdoe@example.com";
address_book.person.add().name = "Jane";

三、使用场景

1、数据存储

在数据存储时,有时需要存储一些重复出现的数据,如博客的标签、新闻的评论等等。使用Repeated字段能够更加方便地对这些数据进行处理。

message Blog {
  repeated string tag = 1;
  ...
}
Blog article = ...
article.tag.add("Google");
article.tag.add("Protobuf");
article.tag.add("Repeated");

2、递归数据结构

在一些场景中,消息类型中可能会包含自身类型,如树形结构、链表结构等等。使用Repeated字段能够更加方便地对这些结构进行处理。

message Node {
  string name = 1;
  repeated Node child_node = 2;
}

3、统计数据

当需要使用统计数据时,如计数、求和等等,使用Repeated字段能够更加方便地进行处理。

message Stats {
  repeated int32 value = 1;
}

四、错误处理

使用Repeated字段时,需要注意一些错误的使用方式。如在定义一个字段时,不能同时使用repeated和required、optional关键词;不能使用repeated和default关键词;不能使用repeated和group关键词。

五、总结

在使用Protobuf时,使用Repeated字段能够更加方便地对重复出现的数据进行处理,特别是在数据存储、递归数据结构以及统计数据等场景下。