文章目录

  • 一、Protobuf简介
  • 二、Protobuf语法
  • 三、protobuf简单使用实例


一、Protobuf简介

Protobuf(protocol buffer):是google 的一种数据交换的格式,它独立于平台语言。 google 提供了protobuf多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。它是一种二进制的格式,网络传输时节省带宽资源,而且它只存储有效数据,比使用xml、json进行数据交换快许多,用protobuf序列化后的大小是json的10分之一,xml格式的20分之一,是二进制序列化的10分之一。 可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。
 

二、Protobuf语法

使用protobuf前需要先进行安装,可以参考该博客:Centos 7安装protobuf3.6.1

1、对于普通单个成员变量,设置方法为set_成员变量名();读取值为实例化对象.成员变量名();
2、对于一个消息类型里成员变量本身又是一个对象,利用mutable_成员变量名()获取相应成员对象的指针,然后使用该指针修改成员数据。
3、对于列表类型,调用add_成员变量名()获取列表所管理的对象的指针,然后使用该指针修改成员数据。
 

三、protobuf简单使用实例

1、先创建xxx.proto文件,然后在xxx.proto配置文件定义好消息类型,消息类型存储的为简单类型。

syntax = "proto3"; //声明了protobuf版本

package fixbug; //声明代码所在的包(类似于C++的namespace)

//定义登录请求消息类型:name、pwd
message LoginRequest
{
    string name = 1; //表示name为LoginRequest类型的第一个字段  实际此处使用bytes更常见
    string pwd = 2; //表示pwd为LoginRequest类型的第二个字段
}

//定义登录响应消息类型:errcpde、errmsg、success
message LoginResponse
{
    int32 errcode = 1; //错误码
    string errmsg = 2; //错误信息
    bool success = 3; //是否登录成功
}

2、执行protoc xxx.proto --cpp_out=OUT_DIR(指定的目录),在当前目录下生成相应的.cc与.h文件。

python使用protobuf protobuf python_数据序列化


3、我们打开.cc与.h发现,实际上我们刚才的配置文件自动生成了对应的类代码。

python使用protobuf protobuf python_python使用protobuf_02


4、我们在main.cc中测试一下,注意要链接protobuf动态库。

main.cc代码:

#include "test.pb.h"
#include <iostream>
#include <string>
using namespace fixbug;

int main()
{
    LoginRequest req;
    req.set_name("zhang san");
    req.set_pwd("123456");

    //数据序列化 => char*:调用SerializeToString方法
    std::string send_str;
    if (req.SerializeToString(&send_str))
    {
        std::cout << "序列化后数据: "<< send_str.c_str() << std::endl;
    }

    //反序列化数据 => login登录请求对象
    LoginRequest reqB;
    if (reqB.LoginRequest::ParseFromString(send_str))
    {
        std::cout << "反序列化后数据: " << req.name() << std::endl;
        std::cout << "反序列化后数据: " << req.pwd() << std::endl;
    }

    return 0;
}

可以看到,我们成功序列化与反序列化数据。

python使用protobuf protobuf python_数据反序列化_03