跳过正文

ProtocolBuffer

yaml笔记

·285 字·2 分钟· ---
yaml # 接触yaml是用来做配置文件的,所以首要的是学习yaml的基本编写规则,暂不做太深入的学习。学习yaml,可以参考wiki,基本各方面都讲到了。下面是摘自wiki的: *YAML (YAML Ain’t Markup Language) is a human-readable data serialization language. It is commonly used for configuration files, but could be used in many applications where data is being stored (e.g. debugging output) or transmitted (e.g. document headers). * 需要学习更多的话,可以参考:YAML Ain’t Markup Language (YAML™) Version 1.2. 语法概要 # 在yaml里面,结构通过缩进来表示,连续的项目(如:数组元素、集合元素)通过减号“-”来表示,map结构里面的键值对(key/value)用冒号“:”来分割。yaml也有用来描述好几行相同结构数据的缩写语法,数组用“[]”包括起来,hash用“{}”来包括。

ProtocolBuffers工作原理

·142 字·1 分钟· ---
ProtocolBuffers工作原理 # 这里记录一下学习与使用Protocol Buffer的笔记,优点缺点如何使用这里不再叙述,重点关注与理解Protocol Buffers的工作原理,其大概实现。 我们经常使用Protocol Buffer进行序列化与反序列化。理解Protocol Buffer的工作原理,就要理解序列化与反序列化。 序列化:将数据结构或对象转换为二进制串的过程; 反序列化:序列化的逆过程; 如何实现呢?核心有两点:编码 + 存储。数据在计算机间通过网络进行传输时,传输的是比特流,只有0和1,并没有你所定义的各种类对象等,你如果想将一个类对象传输到对方,怎么办呢?字符是用过ASCII码编码的,这里也可以设计一套编码方案来对类似类对象这种数据进行编码,只要对方收到后能正确的解码就可以了。编码后还要确定编码后的数据存储方式,这样字节流才是有意义的字节流,这样才能知道读取的字节流有什么含义,代表什么。 好了,我们看一下Protocol Buffer是如何编码和存储的。 Protocol Buffer是如何编码的 # Varint编码 # Varint编码是一种变长的编码方式,核心思想是对数值越小的数字,用越少的字节数表示,这样可以减少数字的字节数,进行数据压缩。 举个例子:对int数据类型,一般需要4个字节来表示,而实际上,对与数值较小的数字而言,无需这么多字节,00000000 00000000 00000000 01111111 | 127,只需要一个字节就能表示,前面3个字节意义不大,浪费了许多空间。 当然,这种编码并不是所有情况下都会变小,当数值非常大时,所需的字节会增多,但因为大多数情况下数值小的数字远比数值大的多,所以整体看来,数据是被压缩了的。 具体的,Varint编码时,对每个字节的最高位赋予特殊含义: 1:表示后序的字节也是该数字的一部分; 0:表示这是最后一个字节,且剩余7bit都用来表示数字(所以Varint解码时,如果读到最高位为0的字节时,就表示已经是Varing的最后一个字节); 因为每个字节的最高位都被占用,用来表示特殊的含义,所以,当数值非常大时,原有的字节数就不够用了,所以编码时要增加字节数。 可以参考下图加深理解: 编码示例: