protobuf详解

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文件

    1
    2
    3
    4
    5
    message 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时需要注意的一点,如果数据消息格式发生变化,需要通过命令重新生成客户端和服务端的消息类,保证两者同步。

如果觉得我的文章对您有用,请随意赞赏