因为项目需要所以学习了gPRC
远程过程调用框架,而这个框架中就是采用Protocol Buffers
进行序列化结构化数据的,这种序列化数据格式与传统的XML、JSON等格式来说,性能以及占用空间方面更小等优点,看到这里是不是有种迫不及待想深入了解下Protocol Buffers
呢?
什么是Protocol Buffers?
引用官方的说法
a language-neutral, platform-neutral, extensible way of serializing structured data for use in communications protocols, data storage, and more.
Protocol Buffers
是一种与语言、平台无关,可拓展序列化数据的方式,用于通讯协议,数据存储等。
Protocol Buffers
是一种灵活、高效、自动化的机制,用于序列化结构化数据。可以定义数据的结构,然后使用独有的编译器轻松将结构化数据写入和读取到各种数据流中,而且支持多种语言,甚至可以在不会破坏“旧”数据格式的情况下更新数据。
Protocol Buffers是怎么运行的?
可以通过.proto
后缀文件中定义Protocol Buffers
消息类型来指定希望如何构建序列化信息。每个Protocol Buffers
消息都是一个小的逻辑信息记录,包含了key-value键值对。如下.proto
是定义人员信息的一个基本的示例:
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
正如我们所看到的,定义的格式很简单,每种消息类型都有一个或多个唯一编号的字段,每个字段都有一个名称和一个值类型,其中值类型可以是数字(整数或浮点数),布尔值,字符串,byte,甚至可以是其他Protocol Buffers
定义的消息类型,允许分层次的构建数据。在数据类型定义中可以指定字段的类型optional(可选)、required(必填)、repeated(重复,即集合) ,详细可以在《Protocol Buffer语法指南》中查看。
一旦定义了数据结构,可以将proto
文件运行在Protocol Buffers
编译器生成对应开发语言的数据访问类。经过编译器编译生成的相应开发平台语言的访问类,包含了简单的访问入口,以及提供将整个数据结构序列化/反序列化为原始字节的方法。
关于Protocol Buffers
如何编译成相关开发平台的具体可以参考官方文档,这里提供了《Protocol Buffers基于Windows平台构建Java版本实现》
为什么不使用XML?
写到这里,可能会有小伙伴疑惑为什么不直接使用传统的XML、JSON数据格式,非得弄得这么麻烦的。
针对于传统序列结构化数据,Protocol Buffers
比XML、JSON具有更多的优点。
- 更简单
- 比其小3到10倍
- 运行速度上快20到100倍
- 耦合性低
- 可以生成更便于编译平台方式的数据访问类
例如,用上面定义好的Person举例,定义一个包含name和email的person对象,在XML中,需要:
<person>
<name> John Doe </ name>
<email> jdoe@example.com </ email>
</ person>
而相应的protocol buffer
消息(protocol buffer文本格式)是:
# Textual representation of a protocol buffer.
# This is *not* the binary format used on the wire.
person {
name: "John Doe"
email: "jdoe@example.com"
}
此对象被编码为protocol buffer
二进制格式(上面文本格式只是便于开发者读写编辑调试使用)时,它大概只有28字节,并且需要大约100-200纳秒来解析。而xml,即使删除空格,xml版本至少也得69字节,并且需要大约5000-10000纳秒才能解析成功。
此外,在操作对象方面来说protocol buffer
也要容易得多。
但,protocol buffer
相对比xml也不都是最好的处理数据的解决方案,protocol buffer
不是标记语言(HTML等),对于文本文档建立结构与文本交错的建模。此外,XML是便于读写编辑的,但protocol buffer
(原生格式)不是。XML可以进行自我描述,但protocol buffer
只有在拥有消息定义(.proto
文件)时,protocol buffer
才有意义。