protobuf 学习总结——protobuf 简单使用

1、protobuf 安装

安装好的目录如下:

protobuf-2.4.1/
|-- bin
|-- include
`-- lib

2、创建一个proto文件

package PAY;

message Person              
{
    optional int32 age = 1;
    optional bytes name = 2;
}

3、创建write.cpp ,用于将对象序列化到文件

#include <iostream>
#include <fstream>
#include "pay.pb.h"
using namespace std;

int main()
{
  PAY::Person person;
  person.set_age(10);
  person.set_name("jack");

  fstream out("myfile.txt", ios::binary | ios::out | ios::trunc);
  if(!out)
  {
    cerr << "open file myfile failed!\n";
    return -1;
  }

  if (!person.SerializeToOstream(&out))
  {
    cerr << "write error!\n";
    return -1;
  }
}                                                                

4、创建read.cpp,用于从文件反序列化对象

#include <iostream>
#include <fstream>
#include "pay.pb.h"
using namespace std;

int main()
{
  PAY::Person person;

  fstream in("myfile.txt", ios::binary | ios::in);
  if (!person.ParseFromIstream(&in))
  {
    cout << "read error" << endl;
    return -1;
  }

  cout << person.age() << endl;
  cout << person.name() << endl;
}                                                 

5、创建makefile 文件

TARGET=libpay.a                                                                         
WRITE=write
READ=read

OBJ = pay.pb.o

$(shell rm -f *.cc *.h)

PROTOBUF_INCL = -I./protobuf-2.4.1/include
PROTOBUF_LIB = -L./protobuf-2.4.1/lib -lprotobuf

all: $(TARGET) $(WRITE) $(READ)

clean:
  rm -f $(TARGET) $(WRITE) $(READ) $(OBJ) pay.pb.h pay.pb.cc

install:

pay.pb.o:pay.pb.cc
  g++ -c -ggdb3 $(PROTOBUF_INCL) $<

$(TARGET): $(OBJ)
  ar -curv $@ $?
  ranlib $@

$(WRITE):write.cpp
  g++ -ggdb3 -o $@ $^ pay.pb.cc $(PROTOBUF_INCL) $(PROTOBUF_LIB)

$(READ):read.cpp
  g++ -ggdb3 -o $@ $^ pay.pb.cc $(PROTOBUF_INCL) $(PROTOBUF_LIB)

pay.pb.cc:pay.proto
  LD_LIBRARY_PATH+=./protobuf-2.4.1/lib/ ./protobuf-2.4.1/bin/protoc -I=. --cpp_out=. $^

6、创建一个执行脚本

#!/bin/bash

export LD_LIBRARY_PATH=protobuf-2.4.1/lib/
./write
./read                                      

综上,代码目录结构为:

protodata/
|-- makefile
|-- myfile.txt
|-- pay.proto
|-- protobuf-2.4.1
|   |-- bin
|   |-- include
|   `-- lib
|-- read.cpp
|-- test.sh
`-- write.cpp

记得要先创建文件myfile.txt

执行 

./test.sh 

结果:

10
jack

 

参考:

ProtoBuf安装和使用简介

 

 

Protobuf是一种高效、快捷的数据交换格式,它具有更高的传输、打包和解包效率,相对于XML等结构化的文本数据格式而言更受欢迎。在使用Protobuf时,可以通过.proto文件定义数据结构,这些数据结构是面向开发者和业务程序的,并不直接面向存储和传输。当需要存储或传输这些数据时,需要对这些结构数据进行序列化、反序列化以及读写操作。为了实现这些操作,Protobuf提供了相应的接口函数。 对于数值类型的字段,Protobuf提供基本的读写函数。而对于string类型的字段,除了基本的读写函数外,还提供了mutable_*函数,用于直接返回string的指针。这些函数可以方便地操作和修改string类型的数据。 在编写.proto文件时,可以使用protoc编译器生成相应的接口代码。使用命令"protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/xxx.proto"可以根据.proto文件生成对应的接口代码,其中$SRC_DIR代表.proto文件所在的源目录,--cpp_out指定生成C++代码的目标目录,$DST_DIR表示生成代码的目标目录,xxx.proto代表要生成接口代码的.proto文件。另外,使用cmake编译时,可以使用protobuf_generate_cpp函数来生成.pb.cc和.pb.h文件的路径,然后在项目中包含这些文件即可使用生成的接口代码。 总结来说,Protobuf提供了用于读写和操作数据的函数,并且可以通过编译器生成相应的接口代码,方便开发者使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [protobuf入门](https://blog.csdn.net/anonymalias/article/details/41329743)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [一文读懂——Protobuf](https://blog.csdn.net/weixin_42905141/article/details/125272803)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值