ProtoBuffer----整体序列化过程

637 阅读2分钟

不同数据类型的编码方式

假设实体对象为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