protobuf

目录

proto文件最终生成了什么

protobuf compiler

proto基础知识

Proto Buf使用一般步骤

定义proto文件

protoc编译器,编译test.proto

protoBuf的C++API读写消息

举例:

.proto文件:

数据结构赋值:

 单个数据类型:

多个数据类型:(需要先定义指针了)

重复的数据类型: 

序列化:

反序列化:


proto文件最终生成了什么

        当运行protobuf compiler编译test.proto时,编译器会以您选择的语言生成代码,您需要使用文件中描述的消息类型,包括获取和设置字段值、将消息序列化为输出流,并从输入流解析消息。

  • 对于C++,编译器会根据每个.proto生成一个.h和.cc文件,其中包含文件中描述的每种消息类型的类。
  • 对于Java,编译器会生成一个.java文件,其中包含每个消息类型的类,以及 Builder用于创建消息类实例的特殊类。

protobuf compiler

protoc --proto_path=IMPORT_PATH --cpp_out=DST_DIR --java_out=DST_DIR path/to/file
--cpp_out生成C++代码存储在DST_DIR
--java_out生成Java 代码存储在DST_DIR

proto基础知识

Proto Buf使用一般步骤


第一步︰定义proto文件,文件的内容就是定义我们需要存储或者传输的数据结构,也就是定义我们自己的数据存储或者传输的协议。
第二步∶使用 ProtoBuf编译器protoc 来编译自定义的proto文件,用于生成.pb.h文件(proto文件中自定义类的头文件)和.pb.cc (proto文件中自定义类的实现文件)。
第三步:使用ProtoBuf 的C++API来读写消息

定义proto文件

使用了 Protocol Buffers 3(proto3)的语法。CpuLoad 消息类型包含了三个 float 类型的字段,分别是 load_avg_1、load_avg_3 和 load_avg_15。

NetInfo 消息类型包含了一个 string 类型的字段 name 和一个 float 类型的字段 send_rate。

MonitorInfo 消息类型包含了一个名为 cpu_load 的 CpuLoad 类型的字段,以及一个名为 net_info 的重复字段,类型为 NetInfo。重复字段可以包含多个 NetInfo 值。

protoc编译器,编译test.proto

protoc -I$SRC_DIR --cpp_out=$DST_DIR test.proto

-I$SRC_DIR:指定包含目录,表示 test.proto 文件所在的目录。这样编译器就能找到相关的导入文件(如果有的话)。
--cpp_out=$DST_DIR:指定输出目录,表示生成的 C++ 代码文件的存放目录。$DST_DIR 是变量,需要替换为实际的目录路径。
test.proto:要编译的 .proto 文件的路径和名称。

protoBuf的C++API读写消息

bool SerializeToString(string* output) const;//将消息序列化并存储在指定的 string 对象中。返回一个布尔值,表示序列化是否成功。


bool ParseFromString(const string& data);   //从给定的 string 对象解析消息。返回一个布尔值,表示解析是否成功。


bool SerializeToArray(void* data, int size) const;     //将消息序列化存储到指定大小的字节数组中。需要传入一个指向字节数组的指针 data 和字节数组的大小 size。返回一个布尔值,表示序列化是否成功。


bool ParseFromArray(const void* data, int size);         //从给定的字节数组解析消息。需要传入一个指向字节数组的指针 data 和字节数组的大小 size。返回一个布尔值,表示解析是否成功。


bool SerializeToOstream(ostream* output) const;         //将消息写入给定的 C++ ostream 对象中。返回一个布尔值,表示写入是否成功。


bool ParseFromIstream(istream* input);         //从给定的 C++ istream 对象解析消息。返回一个布尔值,表示解析是否成功。

        这些方法允许你在消息对象和二进制数据之间进行序列化和反序列化操作。你可以选择根据需求使用合适的方法,将消息对象序列化为二进制数据或者将二进制数据解析为消息对象,以便在网络传输、持久化存储或进程间通信中使用 Protocol Buffers。 

举例:

.proto文件:

syntax = "proto3";

package monitor.proto;

message CpuLoad {
  float load_avg_1 = 1;
  float load_avg_3 = 2;
  float load_avg_15 = 3;
}

message NetInfo {
  string name = 1;
  float send_rate = 2;
}

message MonitorInfo {
  std::string happly = 1;
  CpuLoad cpu_load = 1;
  repeated NetInfo net_info = 2;  //可重复的 相当于数组吧
}

数据结构赋值:

 单个数据类型:

monitor::proto::MonitorInfo monitor_info;
monitor_info.set_happ1y("1111");

多个数据类型:(需要先定义指针了)

::monitor::proto::CpuLoad* cpu_1oad_msg = monitor_info.mutab1e_cpu_1oad();
cpu_1oad_msg->set_1oad_avg_1(1.2);
cpu_1oad_msg->set_1oad_avg_3(1.4);
cpu_1oad_msg->set_1oad_avg_15(1.8);

重复的数据类型: 

::monitor::proto::NetInfo*net_info_msg1 = monitor_info.add_net_info();
net_info_msg1->set_name("super-1");
net_info_msg1->set_send_rate(12.5);
auto net_info_msg2=monitor_info.add_net_info();net_info_msg2->set_name( "super-2");
net_info_msg2->set_send_rate(8.5);

序列化:

//对消息对象MonitorInfo序列化到string容器
std::string serializedstr;
monitor_info.serializeTostring(&serializedstr);
std::cout<<"serialization result:" <<serializedstr<<std::endl;//序列化后的字符串内容

反序列化:

加括号()

//反序列化
monitor::proto::MonitorInfo monitor_info;
monitor_info.ParseFromstring( serializedstr);
std::cout<< monitor_info.happly()<<std::endl;
auto cpu_load_parse =monitor_info.cpu_load( );
std::cout << cpu_load_parse.load_avg_1()<<cpu_load_parse.load_avg_3()<<std::endl;
for (int i = 0; i < monitor_info.net_info_size(); i++) {
std::cout << monitor_info.net_info(i).name();
std::cout << monitor_info.net_info(i).send_rate();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值