protobuf简介
protobuf(Protocol Buffer)是google的一个开源序列化框架,类似于xml、json数据文本交换格式。开发人员需要自己定义结构化的消息格式(proto文件),然后通过protobuf自带的protoc命令来将proto协议文件转换成对应语言的类文件,可以支持php、Java、c++、python语言,我们可以在工程里直接使用生成的类文件来做数据交互。
与json比较
- protobuf采用二进制数据传输,只传输数据本身,不会传输数据的格式(如何属性的名称)。虽然json数据大小会小于xml,但是还是基于纯文本形式,传输时会把数据的组织格式也进行传输。一条消息数据,protobuf序列化后的大小是json的10分之一,xml格式的20分之一,是二进制序列化的10分之一,总体看来protobuf的优势还是很明显的。
- protobuf只要开发人员定义好消息格式,就可以通过命令生成相关语言(java、c++、python等)的类,项目之间调用生成的类就可以完成序列化和反序列化的工作。而json不同语言需要引用不同的json库(如python的json、c++的rapidjson),不同的json库的解析效率也会存在很大区别。
使用步骤
- 下载protobuf库https://github.com/google/protobuf
编写数据结构信息proto文件
12345message Person {required string name=1;required int32 id=2;optional string email=3;}使用protobuf编译器将proto文件编译成特定语言的类(如下生成了c++和python对应的类)
protoc -I=. --cpp_out=. --python_out=. ./xxx.proto
总结
protobuf提供了一个更高效的数据传输协议,相比json数据格式,它的数据传输体积更小。
使用protobuf时需要注意的一点,如果数据消息格式发生变化,需要通过命令重新生成客户端和服务端的消息类,保证两者同步。