当前位置: 首页 > article >正文

在 C++ 中使用 Protocol Buffers(protobuf)

在 C++ 中使用 Protocol Buffers(protobuf)定义的消息结构通常涉及到以下步骤:

  1. 安装 Protocol Buffers 编译器和库

    • 你需要安装 Protocol Buffers 的编译器(protoc)和 C++ 库。如果还没安装,你可以在 Protocol Buffers 官方网站 下载。
  2. 编写 .proto 文件

    • 将你提供的消息结构定义保存到一个 .proto 文件中,例如 com.proto
syntax = "proto3";

message Com {
    message Compo {
        uint32 id = 1;
        uint32 com = 2; 
    }
    repeated Compo comp = 1;
}
  1. 生成 C++ 代码

    • 使用 protoc 编译器将 .proto 文件生成相应的 C++ 代码。
    protoc --cpp_out=. com.proto
    

    这会生成两个文件:com.pb.hcom.pb.cc,它们包含了与 Com 消息相关的 C++ 类和方法。

  2. 在 C++ 代码中使用生成的类

    • 包含生成的头文件,并在代码中使用这些类来创建、序列化、反序列化和操作消息。

以下是一个简单的 C++ 示例,展示了如何使用 Com 消息:

#include <iostream>
#include "com.pb.h"  // 包含生成的头文件
#include <fstream>

int main() {
    // 创建一个 Com 对象
    Com com_message;

    // 添加一个 Compo 对象到 Com 对象中
    Com::Compo* compo = com_message.add_comp();
    compo->set_id(101);
    compo->set_com(202);

    // 再添加一个 Compo 对象
    Com::Compo* compo2 = com_message.add_comp();
    compo2->set_id(102);
    compo2->set_com(203);

    // 序列化到文件
    std::ofstream output("com_message.bin", std::ios::out | std::ios::binary);
    if (!com_message.SerializeToOstream(&output)) {
        std::cerr << "Failed to write com_message." << std::endl;
        return -1;
    }
    output.close();

    // 反序列化从文件
    Com new_com_message;
    std::ifstream input("com_message.bin", std::ios::in | std::ios::binary);
    if (!new_com_message.ParseFromIstream(&input)) {
        std::cerr << "Failed to parse com_message." << std::endl;
        return -1;
    }
    input.close();

    // 打印反序列化的数据
    for (int i = 0; i < new_com_message.comp_size(); ++i) {
        const Com::Compo& compo = new_com_message.comp(i);
        std::cout << "ID: " << compo.id() << ", Com: " << compo.com() << std::endl;
    }

    return 0;
}

解释

  • 创建 Com 对象:通过 Com com_message; 创建一个 Com 对象实例。
  • 添加 Compo 对象:使用 add_comp() 方法向 com_message 中添加 Compo 对象并设置其 idcom 字段。
  • 序列化:使用 SerializeToOstream 方法将消息序列化并写入文件。
  • 反序列化:使用 ParseFromIstream 方法从文件中读取并反序列化消息。
  • 访问数据:遍历 Com 中的 comp 数组,访问每个 Compo 对象的字段。

这段代码展示了如何在 C++ 中使用 protobuf 消息进行序列化和反序列化操作。它可以应用在数据传输、配置管理、持久化存储等场景中。


http://www.kler.cn/a/541457.html

相关文章:

  • Docker 1. 基础使用
  • MYSQL学习笔记(七):新年第一篇之子查询
  • JavaScript:还在用if判断属性是否存在?哒咩(?.)用起来
  • 前端开发架构师Prompt指令的最佳实践
  • webpack配置之---output.chunkLoadTimeout
  • swap内存
  • ESLint 如何处理 ES6+ 语法
  • excel LOOKUP
  • Git 分布式版本控制工具使用教程
  • 第四节 docker基础之---dockerfile部署JDK
  • javaEE-11.javaScript入门
  • Oracle的学习心得和知识总结(三十三)|Oracle数据库数据库的SQL ID的底层计算原理分析
  • 神经网络常见激活函数 7-ELU函数
  • SOME/IP报文格式及发现协议详解
  • JUnit 5 源码结构概览
  • 基于web前端对简书页眉的开发及登陆的跳转
  • 项目6:基于大数据校园一卡通数据分析和可视化
  • 每日一题——缺失的第一个正整数
  • Open-Interface:基于大语言模型 LLM 的自动化界面操作系统
  • 前端开发中,如何判断一个元素是否在可视区域中?
  • ZND网络分析仪,一款高性能的测试与测量设备
  • 10:超级玛丽游戏
  • 利用NestJS构建高效的RESTful API接口
  • 什么是推理大模型?DeepSeek R1推理大模型与DeepSeek V3模型的区别是什么?什么时候该使用推理大模型?
  • 【Linux】:Socket编程应用层 TCP
  • [学习笔记] Kotlin Compose-Multiplatform