protobuf 基本使用

proto 文件格式

protobuf 复制代码
 syntax = "proto3";              // 指定版本信息,不指定会报错
 packag pb;                      // 后期生成go文件的包名
 // message为关键字,作用为定义一种消息类型
 message Person{
     string name = 1;   // 名字
     int32  age = 2 ;   // 年龄
 }
 ​
 enum test{
     int32 age = 0;
 }

protobuf 和 C++

  1. 没有设置默认值,也会有默认值,例如:布尔类型(bool)默认为 false。

  2. 定义类型,唯一的标识符,范围为1到2^29 - 1

  3. 导入头文件,首先是包名作为namespace,声明变量pb::Person person;

  4. proto2中required optional repeated 必须写,不写编译不通过

  5. proto3中只有repeated可用,写了其他的,编译不通过

  6. required:必须包含
    optional:可选包含
    repeated:可以重复包含

  7. 若required写了,在序列化时候,会报错

  8. 常见使用方法

    cpp 复制代码
    #include "person.pb.h"
    #include <iostream>
    using namespace std;
    
    
    int main() {
        // 创建一个 Person 对象并设置其字段
        pb::Person person;
        // 设置值,方式一
        person.set_name("chang");
        cout << person.name() << endl; 
    
        // 设置值,方式二
        person.mutable_name()->assign("jiang");
        cout << person.name() << endl; 
    
        // 设置值,方式三
        pb::Person person1;
        person.CopyFrom(person1);
        person.mutable_name()->assign("da");
        cout << person.name() << endl; 
    
        // 如果是消息体嵌套,方式一
        pb::Person::Student* student2 = person.add_s();
        student2->set_id("fef");
    
        student2 = person.add_s();
        student2->set_id("fef");
    
        cout << person.s_size() << endl;
        cout << person.s(0).id() << endl; 
        cout << person.s(1).id() << endl; 
    
        // 如果是消息体嵌套,方式二
        person.add_s();
        person.mutable_s(2)->set_id("e2");
        cout << person.s_size() << endl;
        cout << person.s(2).id() << endl; 
    
        // 序列化
        std::string serialized_data;
        person.SerializeToString(&serialized_data);
    
        // 反序列化
        pb::Person new_person;
        new_person.ParseFromString(serialized_data);
        return 0;
    }
  9. proto编译成c++,protoc --cpp_out=./ ./demo.proto

  10. c++编译成执行文件g++ test.cpp person.pb.cc -lprotobuf -pthread

protobuf 和 python

  1. 编译方式:protoc --python_out=./ person.proto

  2. 常见使用

    python 复制代码
    import person_pb2            # 直接导入编译好的文件
    p =  person_pb2.Person()     # 直接使用message类
    p.name = "fwef"
    print(p.name)
    
    # 将消息序列化为字节串
    serialized_data = p.SerializeToString()
    
    # 将字节串反序列化为消息对象
    new_person = person_pb2.Person()
    new_person.ParseFromString(serialized_data)

常见C++报错一:

bash 复制代码
terminate called after throwing an instance of 'std::system_error'
  what():  Unknown error -1
Aborted (core dumped)

参考文档

解决方案:

bash 复制代码
# 增加参数 -pthread
g++ test.cpp person.pb.cc -lprotobuf -pthread
相关推荐
linweidong3 小时前
C++ 模块化编程(Modules)在大规模系统中的实践难点?
linux·前端·c++
冷雨夜中漫步7 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
郝学胜-神的一滴7 小时前
深入解析Python字典的继承关系:从abc模块看设计之美
网络·数据结构·python·程序人生
百锦再7 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
半桔7 小时前
【IO多路转接】高并发服务器实战:Reactor 框架与 Epoll 机制的封装与设计逻辑
linux·运维·服务器·c++·io
HABuo8 小时前
【linux文件系统】磁盘结构&文件系统详谈
linux·运维·服务器·c语言·c++·ubuntu·centos
我在人间贩卖青春8 小时前
C++之多重继承
c++·多重继承
m0_736919109 小时前
C++代码风格检查工具
开发语言·c++·算法
喵手9 小时前
Python爬虫实战:旅游数据采集实战 - 携程&去哪儿酒店机票价格监控完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集结果csv导出·旅游数据采集·携程/去哪儿酒店机票价格监控
2501_944934739 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python