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
相关推荐
杰佛史彦明 本王是暴君13 小时前
PyTorch KernelAgent 源码解读 ---(2)--- 总体流程
人工智能·pytorch·python
Zane199414 小时前
别再手写 try/finally 了:一文讲透 with 语句背后的上下文管理器协议
后端·python
李可以量化14 小时前
量化高性能服务框架 Tornado 全面解析(上):异步非阻塞的核心能力与场景落地
大数据·python·量化交易·tornado·qmt·ptrade
June`14 小时前
warp shuffle指令
c++·人工智能·算法·cuda
内蒙深海大鲨鱼14 小时前
3.Introduction to PyTorch YouTube Series--Autograd
人工智能·pytorch·python
用户03321266636714 小时前
使用 Python 在 Excel 中添加或删除批注
python·excel
dogstarhuang14 小时前
手把手用 Doubao-Seed-Evolving 写一个网站监控脚本:完整代码与两处踩坑
python·ai编程·掘金技术征文
ZZHow102414 小时前
PyTorch深度学习入门笔记(小土堆)P7-14
人工智能·pytorch·笔记·python·深度学习
乱七八糟的屋子14 小时前
【C++数值计算】NumCpp超详细入门教程(纯正Numpy语法、零学习成本、C++首选科学计算库、性能压测对比)
c++·数值计算·numpy·高性能计算·科学计算·ndarray
choumin14 小时前
C程序能调用extern “C“声明的带默认参数的C++函数吗?
c语言·c++·extern c·默认参数