protobuf的简单使用

介绍

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

使用

定义protobuf配置文件

test.proto//配置文件

syntax ="proto3";//声明protobuf版本
package rpcProto;//声明了代码所在的命名空间

//定义登录请求消息类型
message loginRequest
{
    string name=1;//表示loginRequest消息的第一个字段
    string passwd=2;//表示loginRequest消息的第二个字段
}

message loginResponse
{
    int32 errcode=1;
    string errmsg=2;
    bool success=3;
}

对于消息类型中数据类型为string的字段,为了提高效率,可以将string类型替换为bytes类型,并且并不影响后期在代码中的使用,如下所示

syntax="proto3";//声明protobuf版本
package rpcProto;//声明了代码所在的命名空间

//定义登录请求消息类型
message loginRequest
{
    bytes name=1;//表示loginRequest消息的第一个字段
    bytes passwd=2;//表示loginRequest消息的第二个字段
}

message loginResponse
{
    int32 errcode=1;
    bytes errmsg=2;
    bool success=3;
}

根据配置好文件生成对应的类文件

在终端输入以下命令

protoc test.proto --cpp_out=./

 该命令表示通过test.protobuf配置文件生成c++代码文件,输出目录为当前目录./

如图所示,protobuf为我们生成了两个文件test.pb.cc和test.pb.h

在这两个文件里,有两个类分别是loginRequest和loginResponse,也就是我们在配置文件里定义的两个消息类型,并且为这两个类声明了对应的方法

换句话说,protobuf会为我们在配置文件中定义的消息类型生成对应的类

测试

接下来,我们在main.cc文件里测试protobuf

#include<iostream>
#include<string>
#include<test.pb.h>
using namespace std;
using namespace rpcProto;

int main()
{
    //定义登录请求消息对象
    loginRequest req;
    //封装消息
    req.set_name("张三");
    req.set_passwd("123456");

    //消息的序列化
    cout<<"消息的序列化:"<<endl;
    string send_str;
    if(req.SerializeToString(&send_str))
    {
        cout<<send_str<<endl;
    }

    //从send_str中反序列化一个login请求对象
    loginRequest reqb;
    cout<<"消息的反序列化:"<<endl;
    if(reqb.ParseFromString(send_str))
    {
        cout<<reqb.name()<<endl;
        cout<<reqb.passwd()<<endl;
    }
}

在终端输入以下命令

g++ main.cc test.pb.cc -lprotobuf -I.

其中-I选项表示指定包含头文件test.pb.h的目录

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Protocol Buffers(简称 Protobuf)是一种语言无关、平台无关、可扩展的序列化数据格式,它可以用于数据存储、通信协议等领域。Protobuf 是 Google 公司开发的,它的主要优点是高效、轻量、可扩展。 下面是 Protobuf 的详细使用方法: 1. 安装 Protobuf 首先,需要安装 Protobuf 编译器。可以从官网下载安装包,也可以使用包管理工具进行安装。以下是在 Ubuntu 上使用 apt-get 进行安装的示例: ``` $ sudo apt-get install protobuf-compiler ``` 2. 定义 Protobuf 文件 Protobuf 使用 .proto 文件来定义数据结构。以下是一个简单的示例: ``` syntax = "proto3"; message Person { string name = 1; int32 age = 2; repeated string email = 3; } ``` 上面的示例定义了一个名为 Person 的消息类型,它包含三个字段:name、age 和 email。其中,name 和 age 是必需的字段,而 email 是可重复的字段。 3. 编译 Protobuf 文件 使用 Protobuf 编译器将 .proto 文件编译成目标语言的代码。以下是在 Linux 上使用命令行编译的示例: ``` $ protoc --proto_path=./proto --cpp_out=./src ./proto/person.proto ``` 上面的示例将 ./proto 目录下的 person.proto 文件编译成 C++ 代码,并将生成的代码存放在 ./src 目录下。 4. 序列化和反序列化 使用生成的代码进行序列化和反序列化操作。以下是一个示例: ```c++ #include "person.pb.h" #include <iostream> #include <fstream> using namespace std; int main() { // 创建一个 Person 对象 Person person; person.set_name("Tom"); person.set_age(20); person.add_email("tom@example.com"); person.add_email("tom@gmail.com"); // 将 Person 对象序列化到文件中 fstream output("person.bin", ios::out | ios::binary); person.SerializeToOstream(&output); output.close(); // 从文件中读取序列化的 Person 对象 fstream input("person.bin", ios::in | ios::binary); Person person2; person2.ParseFromIstream(&input); input.close(); // 输出读取到的 Person 对象的信息 cout << "name: " << person2.name() << endl; cout << "age: " << person2.age() << endl; for (int i = 0; i < person2.email_size(); i++) { cout << "email: " << person2.email(i) << endl; } return 0; } ``` 上面的示例将创建一个 Person 对象,并将其序列化到文件中。然后,从文件中读取序列化的 Person 对象,并输出其信息。 以上就是 Protobuf 的详细使用方法。需要注意的是,每个目标语言的生成代码可能会有所不同。因此,在使用 Protobuf 时,需要查看官方文档,了解相关的生成代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值