1. Protocol Buffer
常用的结构化数据处理工具有:XML、JSON、Protocol Buffer。其中Protocol Buffer是谷歌开发的处理结构化数据的工具。
- 这里结构化的数据,指的是拥有多种属性的数据。如 要记录一些用户的信息,包括用户的名字、ID、E-mail地址,那么这就是一个结构化的数据。
- 要将这些结构化的用户信息持久化或者进行网络传输时,就需要先将它们序列化。所谓序列化,是将结构化的数据变成数据流的格式,也就是变成一个字符串。
- 将结构化的数据序列化,并从序列化之后的数据流中还原出原来的结构化数据,统称为处理结构化数据,这就是Protocol Buffer解决的主要问题。
2. Protocol Buffer的格式
XML的格式为:
<user> <name>张三</name> <id>12345</id> <email>zhangsan@abc.com</email> </user>
JSON的格式为:
{ "name": "张三", "id": "12345", "email": "zhangsan@abc.com", }
Protocol Buffer格式的数据和XML、JSON格式的数据有较大的区别。
- Protocol Buffer序列化之后得到的数据是二进制流,不是可读的字符串
- XML、JSON格式的信息都包含在了序列化之后的数据中,不需要任何其他信息就能够还原序列化之后的数据。但使用Protocol Buffer时需要先定义数据的格式。还原一个序列化之后的数据,需要使用到这个定义好的数据格式。由于这样的差别,Protocol Buffer序列化出来的数据要比XML格式的数据小3~10倍,解析时间快20~100倍。
以下代码给出了上述用户信息样例的数据格式定义文件:message user{ optional string name=1; required int32 id=2; repeated string email=3; }
Protocal Buffer 定义数据格式的文件一般保存在 .ptoto 文件中。每个message代表了一类结构化的数据,比如这里的用户信息。message里面定义了每一个属性的类型和名字。
- Protocol Buffer里属性的类型可以是像布尔型、整数型、实数型、字符型这样的基本类型,也可以是另外一个message。这样大大增加了Protocol Buffer的灵活性。
- 在message中,Protocol Buffer也定义了一个属性是必需的(required)还是可选的(optional),或者是可重复的(repeated)。
|必需的(required):message的所有实例都需要有这个属性;
|可选的(optional):这个属性的取值可以为空;
|可重复的(repeated),那么这个属性的取值可以是一个列表。
以用户信息为例,所有用户都需要有ID,所以ID这个属性是必需的;不是所有用户都填写了姓名,所以姓名这个属性是可选的;一个用户可能有多个E-mail地址,所以E-mail地址是可重复的。Protocol Buffer 是tensorflow系统中使用到的重要工具,tensorflow中的数据基本都是通过 Protocol Buffer来组织的