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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值