【protobuf】protobuf自定义数据格式,CMake编译C++文件读写自定义数据

protobuf自定义数据格式,CMake编译文件读写自定义数据

1.protobuf安装

protobuf库链接

2.定义.proto文件

新建一个Person.proto文件和一个Animal.proto文件,内容如下:

cpp 复制代码
syntax = "proto3";

package UserInfo;

message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;
}
cpp 复制代码
syntax = "proto3";

package UserInfo;

message Animal {
  string name = 1;
  int32 id = 2;
  int32 age = 3;
}

3.编写main.cpp

main函数中对proto中的对象进行序列化和反序列化,内容如下:

cpp 复制代码
#include "Animal.pb.h"
#include "Person.pb.h"
#include <fstream>
#include <iostream>

int main() {
  {
    // 创建 Person 对象
    UserInfo::Person person;
    person.set_name("John Doe");
    person.set_id(123);
    person.set_email("john.doe@example.com");

    // 将数据序列化到文件
    std::ofstream output("person_data", std::ios::binary);
    person.SerializeToOstream(&output);
    output.close();

    // 从文件中读取数据并反序列化
    UserInfo::Person read_person;
    std::ifstream input("person_data", std::ios::binary);
    read_person.ParseFromIstream(&input);
    input.close();

    // 打印反序列化后的数据
    std::cout << "Name: " << read_person.name() << std::endl;
    std::cout << "ID: " << read_person.id() << std::endl;
    std::cout << "Email: " << read_person.email() << std::endl;
  }
  { // 创建 Animal 对象
    UserInfo::Animal animal;
    animal.set_name("Dog");
    animal.set_id(456);
    animal.set_age(5);

    // 将数据序列化到文件
    std::ofstream output("animal_data", std::ios::binary);
    animal.SerializeToOstream(&output);
    output.close();

    // 从文件中读取数据并反序列化
    UserInfo::Animal read_animal;
    std::ifstream input("animal_data", std::ios::binary);
    read_animal.ParseFromIstream(&input);
    input.close();

    // 打印反序列化后的数据
    std::cout << "Name: " << read_animal.name() << std::endl;
    std::cout << "ID: " << read_animal.id() << std::endl;
    std::cout << "age: " << read_animal.age() << std::endl;
  }

  return 0;
}

&ems;注意这时候我们的main.cpp文件是报错的,因为找不到Animal.h文件和Person.h文件,没关系,接下来编辑CMAkeLists.txt配置文件,生成相应的头文件即可!

4.编写CMAkeLists配置文件

cpp 复制代码
cmake_minimum_required(VERSION 3.5)
project(YourProjectName)

set(CMAKE_CXX_STANDARD 11)

# 查找protobuf库
find_package(Protobuf REQUIRED)

# 获取所有的protobuf文件
file(GLOB PROTO_FILES "proto/*.proto")

# 生成protobuf文件的C++代码
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS ${PROTO_FILES})

# 添加生成的protobuf文件到项目中
include_directories(${CMAKE_CURRENT_BINARY_DIR})
include_directories(${PROTOBUF_INCLUDE_DIRS})

# 添加可执行文件
add_executable(main main.cpp ${PROTO_SRCS} ${PROTO_HDRS})

# 链接protobuf库
target_link_libraries(main ${PROTOBUF_LIBRARIES})

5.运行

cpp 复制代码
mkdir build
cd build
cmake ..
make 
./main

结果如下:

相关推荐
汉克老师2 小时前
GESP2025年3月认证C++五级( 第三部分编程题(1、平均分配))
c++·算法·贪心算法·排序·gesp5级·gesp五级
智者知已应修善业5 小时前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
云泽8087 小时前
C++11 核心特性全解:列表初始化、右值引用与移动语义实战
开发语言·c++
AI进化营-智能译站8 小时前
ROS2 C++开发系列12-用多态与虚函数构建可扩展的ROS2机器人行为模块
开发语言·c++·ai·机器人
Morwit8 小时前
QML组件之间的通信方案(暴露子组件)
c++·qt·职场和发展
qeen878 小时前
【数据结构】建堆的时间复杂度讨论与TOP-K问题
c语言·数据结构·c++·学习·
图码8 小时前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
handler018 小时前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法
zhouwy1138 小时前
Linux进程与线程编程详解
linux·c++
A7bert7779 小时前
【YOLOv8pose部署至RDK X5】模型训练→转换bin→Sunrise 5部署
c++·python·深度学习·yolo·目标检测