repeated
1、定义
repeated类型
相当于STL的vector
,可以用来存放N个相同类型
的内容。proto2
中还有repeated
可选,在proto3
中则已经被摒弃并且默认格式为pack
。packed
修饰只用于repeated
字段 或 基本类型的repeated
字段,用在其他字段,编译 .proto
文件时会报错
2、使用事项
repeated
修饰的字段有两种表达方式:
message Test
{
repeated int32 Car = 4 ;
// 表达方式1:不带packed=true
repeated int32 Car = 4 [packed=true];
// 表达方式2:带packed=true,连续存储
// proto 2.1 开始可使用
// 区别在于:是否连续存储repeated类型数据
}
// 在代码中给`repeated int32 Car`附上3个字段值:3、270、86942
Test.setCar(3);
Test.setCar(270);
Test.setCar(86942);
对于同一个 repeated
字段、多个字段值来说,他们的Tag
都是相同的,即数据类型 &
标识号都相同。
1、问题:表达方式 1
若以传统的多个 T - V-T - V-T - V
对存储(不带packed=true
),则会导致Tag
的冗余,即相同的Tag存储多次;
2、解决方案:表达方式 2
采用带packed=true
的 repeated
字段存储方式,即将相同的 Tag
只存储一次、添加 repeated
字段下所有字段值的长度Length
、连续存储 repeated
字段值,组成一个大的Tag - Length - Value -Value -Value
对,即T - L - V - V - V
对。
参考
1、https://blog.csdn.net/fuzhufang/article/details/39895551
2、https://blog.csdn.net/mycwq/article/details/19622571
3、https://blog.csdn.net/carson_ho/article/details/70568606