ProtoBuf(Google Protocol Buffers)—— repeated 修饰字段注意点(packed修饰)

ProtoBuf—— (repeated 修饰 )

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=truerepeated 字段存储方式,即将相同的 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

猜你喜欢

转载自blog.csdn.net/JMW1407/article/details/107467238