21xrx.com
2024-11-05 18:29:43 Tuesday
登录
文章检索 我的文章 写文章
Protobuf C++示例
2023-06-22 02:44:31 深夜i     --     --
Protobuf C++ 示例 序列化 反序列化

谷歌开源的ProtoBuf,即Protocol Buffers,是一种轻量级的数据交换格式,同时也是一种语言无关、平台无关、可扩展且性能高效的序列化数据方式。Protobuf通常用于分布式系统中的数据交换和存储,支持C++、Java、Python等多种编程语言。本文将介绍如何使用Protobuf C++示例。

安装Protobuf

如果是Ubuntu或Debian,可以使用以下命令进行安装:

sh

sudo apt-get install protobuf-compiler libprotobuf-dev

如果是macOS,可以使用以下命令进行安装:

sh

brew install protobuf

如果使用其他操作系统,可以在Protobuf的官方网站上下载压缩包。

使用Protobuf C++示例

在安装完Protobuf之后,我们可以开始使用Protobuf C++示例。首先,我们需要在.proto文件中定义消息格式。例如,我们可以定义一个Person.proto文件,其中包含以下内容:

protobuf

syntax = "proto3";

package tutorial;

message Person {

 string name = 1;

 int32 id = 2;

 string email = 3;

 enum PhoneType

  MOBILE = 0;

  HOME = 1;

  WORK = 2;

 

 message PhoneNumber

  string number = 1;

  PhoneType type = 2;

 

 repeated PhoneNumber phones = 4;

}

Person消息包含了一个名字、ID、邮箱和电话号码等信息。在Person消息中,我们还可以定义一个枚举类型PhoneType,以及一个嵌套定义的PhoneNumber消息类型。PhoneNumber消息类型包含一个电话号码和一个PhoneType类型的值。在Person消息中,我们还定义了一个repeated类型的phones字段,用于存储多个电话号码。

接下来,我们需要使用Protobuf的编译器protoc来生成C++代码。我们可以使用以下命令生成代码:

sh

protoc --cpp_out=. Person.proto

执行以上命令后,我们将获得一个Person.pb.h和Person.pb.cc文件,它们是根据Person.proto自动生成的。

在我们的C++程序中,我们需要包含Person.pb.h头文件,并使用Protobuf的API来对Person消息进行序列化和反序列化。例如,我们可以使用以下代码来对Person消息进行序列化:


#include "Person.pb.h"

#include <iostream>

int main() {

 tutorial::Person person;

 person.set_name("Alice");

 person.set_id(1001);

 person.set_email("alice@example.com");

 tutorial::Person::PhoneNumber* phone_number = person.add_phones();

 phone_number->set_number("123456");

 phone_number->set_type(tutorial::Person::PhoneType::HOME);

 std::string serialized_person;

 person.SerializeToString(&serialized_person);

 std::cout << "Serialized person: " << serialized_person << std::endl;

 return 0;

}

在以上代码中,我们首先创建了一个Person对象,并给其赋值。然后,我们添加了一个PhoneNumber对象,并对其进行赋值。接着,我们使用person的SerializeToString()方法将Person对象序列化为字符串,并打印输出。

除了序列化,我们也可以使用反序列化来将字符串还原为Person对象。例如,我们可以使用以下代码对Person对象进行反序列化:


tutorial::Person restored_person;

restored_person.ParseFromString(serialized_person);

std::cout << "Restored person: " << restored_person.DebugString() << std::endl;

在以上代码中,我们创建了一个restored_person对象,并使用其ParseFromString()方法来从字符串中反序列化出Person对象。最后,我们使用restored_person的DebugString()方法打印出反序列化后的Person对象信息。

总结

本文介绍了如何使用Protobuf C++示例,并给出了一个简单的示例代码,包括如何定义消息格式、使用Protobuf编译器生成代码、对Person对象进行序列化和反序列化。对于想要使用Protobuf的开发者,本文提供了一些参考,并可以帮助开发者快速上手使用。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复