Protocol Buffer由Google出品的一款轻量而高效的数据序列化和反序列化的方法,下面的我们来介绍一下Protocol Buffer的内部实现原理。
1.类实例
编码包括数据的编解码和函数方法的还原
2.ProtcolBuffer的数据类型
Type | Meaning | Used For |
---|---|---|
0 | Varint | int32, int64, uint32, uint64, sint32, sint64, bool, enum |
1 | 64-bit | fixed64, sfixed64, double |
2 | Length-delimited | string, bytes, embedded messages, packed repeated fields |
3 | Start group | groups (deprecated) |
4 | End group | groups (deprecated) |
5 | 32-bit | fixed32, sfixed32, float |
3.编码格式
message user
{
optional int32 id = 1;
optional string name = 2 ;
}
KEY = VARINT(tag<<3|Type)
Tag在user中当为Id时为1,为name为是2,即message成员的编号。
Type是前一页中的数据类型type.
VARINT是经过zipzag压缩后的数据。
4.ZIPZAG编码
编码原则:
- 尽可能压缩无效的数据位0。
- 保留符号位。
- 尽量用自身表示压缩后的长度。
- 负数进行正数(补码)化进行类似操作。
步骤:
- 数据编码
- (7:8)编码。
//数据编码
int encode
{
return (n <<1) ^ (n >>31);
}
//数据解码
int decode(int n)
{
// return (((unsignedint)n) >>1) ^ -(n & 1);
// return
}
ZIPZAG编码举例
数据以7位为单位进行分隔,当高位还有有效数时在BIT7位补1 ,依次类推.
以0x18f为例 :
5.PB编码举例
message user
{
optional int32 id = 1;
optional string name = 2 ;
}
User:
id 值为: 8
Name 值为: “nihao”
Id:
key= ((id:1)<<3) | (type: 0)
value = 10 (encode(10))
Name:
key = ((id:2)<<3 | (type:2))
value = “nihao” //asiic码
len =5 (decode(5))