Protocol Buffer是Google开发的处理结构化数据的工具.
什么是结构化数据?
假设要记录一些用户信息,每个用户的信息中都包括用户的名字,ID和email地址,那么每个用户的信息可以表示成一下的形式:
name:张三id:12345email:zhangsan@abc.com
这就是一个结构化的数据。是指拥有多种属性的数据,比如上述拥有三个不同的属性。
当要将这些结构化的用户信息持久化或者进行网络传输时,就需要先将它们序列化;所谓序列化就是将结构化的数据变成数据流的形式,简单来说就是变成字符串。如何将结构化的数据序列化,并从结构化之后的数据流中还原出原来的结构化数据,统称为处理结构化数据,这就是Protocol Buffer解决的主要问题。
Protocol Buffer格式的数据与XML和json格式的数据有着比较大的差别。首先,Protocol Buffer序列化之后得到的数据不是可读的字符串,而是二进制流;其次,XML或者json格式数据信息都包含在了序列化之后的数据中,不需要任何其他信息就能还原数据;但使用Protocol Buffer时需要先定义数据的格式(schema),还原一个序列化之后的数据将需要使用这个定义好的数据格式。
以下是数据格式定义文件:
message user { optional string name = 1; required int32 id = 2; repeated string email = 3; }
因为这样的差别,Protocol Buffer序列化出来的数据要比XML格式的数据小3到10倍,解析时间要快20到100倍。
Protocol Buffer定义数据格式的文件一般保存在.proto中。每一个message代表了一类结构化数据,比如这里的用户信息,message里面定义了每一个属性的类型和名字,属性的类型可以布尔型,整数型,实数型,字符型这样的基本类型。也可以是另一个message,Protocol Buffer也定义了一个属性是必须的(required),还是可选的(optional),或者是可重复的(repeated),在最新的Protocol Buffer3中已经不再支持required类型。
Protocol Buffer是TensorFlow系统中使用到的重要工具,TensorFlow中的数据基本上都是通过Protocol Buffer来组织的,分布式TensorFlow的通信协议gRPC也是以这个作为基础的。
作者:富城
链接:https://www.jianshu.com/p/bc4c24e8bfea