
假设实体对象为IDL文件:
message Student {
// 此处的 1 2就是下面Tag算法中的filed_number,表示属性字段的编号id
required int32 studentId = 1;
required int32 studentScore = 2;
}
// 序列化的时候给两个属性设置两个值
setStudentId = 2
setStudentScore = 80
经过protobuffer序列化后字节数组为:8 2 16 80 (8个字节变成4个字节) 因为都是int32类型,序列化存储方式为:Tag-Value、Tag-Value Tag的编码算法:Tag = (filed_number << 3) | wire_type
filed_number
a.studentId的Tag = ( 1 << 3) | 0
0000 0001
0000 1000 // 1 << 3
|
0000 0000
---------
0000 1000 ---> 等于8
studentId的Value:因为是int32类型,使用varint编码
2 --> 0000 0000 0000 0010
000 0010 // 取低位7个bit
0000 0010 // 高位没有字节数据了,字节在当前字节最高位补0,编码完成。
2经过varint编码后为:0000 0010,也就是十进制的2
studentId属性数据2经过protobuffer序列化后字节数组为:8 2
b. studentScore的Tag = ( 2 << 3) | 0
0000 0010
0001 0000 // 2 << 3
|
0000 0000
---------
0001 0000 ---> 等于16
studentScore的Value:因为是int32类型,使用varint编码
2 --> 0000 0000 0101 0000
101 0000 // 取低位7个bit
0101 0000 // 高位没有字节数据了,字节在当前字节最高位补0,编码完成。
2经过varint编码后为:0101 0000,也就是十进制的80
studentScore属性数据2经过protobuffer序列化后字节数组为:16 80