protobuf c++编程笔记

编辑: admin 分类: c#语言 发布时间: 2022-03-15 来源:互联网
目录
  • 字段内容的定义
    • 修饰符
    • 字段类型
    • 引用方式
  • 不同字段的方法
    • 1)optional修饰的基本类型:
    • 2)optional修饰的对象类型:
    • 3)repeated修饰的基本类型:
    • 4)repeated修饰的对象类型:
    • 序列化
    • 反序列化
  • 总结

    字段内容的定义

    //文件名:addressbook.proto
    syntax = "proto2";//proto版本
    //.proto文件新增一个可选的package声明符,用来防止不同的消息类型有命名冲突。
    //包的声明符会根据使用语言的不同影响生成的代码。对于C++,产生的类会被包装在C++的命名空间中。
    package tutorial;package声明符
    message Person {
      required string name = 1;//姓名,= 1 二进制编码中使用的唯一 “标记”
      required int32 id = 2;//ID
      optional string email = 3;//email
      enum PhoneType {//枚举消息类型
        MOBILE = 0;//proto3版本中,首成员必须为0,成员不应有相同的值
        HOME = 1;
        WORK = 2;
      }
    //
      message PhoneNumber {
        required string number = 1;
        optional PhoneType type = 2 [default = HOME];
      }
      repeated PhoneNumber phones = 4;//phones为数组
    }
    message AddressBook {
      repeated Person people = 1;
    }
    

    修饰符

    • required 必须提供该字段的值,否则消息会被认为是”未初始化的“
    • optional

    表示属性值为可选项,不指定使用默认值。int和char数据类型默认为0,string默认为空,bool默认为false,嵌套message默认为构造,枚举为第一个

    • repeated 表示该属性为重复字段,可看走是动态数组,类似于c++中的vector

    如果为optional属性,发送端没有包含该属性,则接收端在解析式采用默认值。对于默认值,如果已设置默认值,则采用默认值,如果未设置,则类型特定的默认值为使用,例如string的默认值为”“。

    字段类型

    • package

    相当于namespace

    • message

    相当于clas

    • name

    相当于属性值

    引用方式

    • 类成员函数变量

    package::message.方法()

    • 标准meaasge方法

    1.bool IsInitialized() const;: 检查是否已设置所有必填 required 字段

    2.string DebugString() const;: 返回 message 的人类可读表达,对调试特别有用

    3.void CopyFrom(const Person& from);用给定的 message 的值覆盖 message

    4.void Clear();: 将所有元素清除回 empty 状态

    不同字段的方法

    1)optional修饰的基本类型:

    • set_属性名(val) :初始化修改属性值;
    • 属性名():获取属性值,只读模式,返回类型是::google::protobuf::int64;

    2)optional修饰的对象类型:

    • 属性名():返回只读的属性类型对象的引用,属性类型是指pb中定义的对象;
    • mutable_属性名():返回可修改的属性类型对象的指针,属性类型是指pb中定义的对象;
    • set_属性名():初始化设置字段值

    3)repeated修饰的基本类型:

    • add_属性名(val):向属性集合中添加元素;
    • 属性名_size():获取集合大小;
    • 属性名(i):返回集合中某一个元素,返回类型::google::protobuf::int64;
    • 属性名():返回只读的整个集合的引用,返回的集合类型是const ::google::protobuf::RepeatedField< ::google::protobuf::int64 >&,可以使用iterator来迭代遍历,可用于修改;
    • mutable_属性():返回可修改的整个集合的指针,返回的集合类型::google::protobuf::RepeatedField< ::google::protobuf::int64 >*,可以使用iterator来迭代遍历,可用于修改;
    • set_属性名(int,x):设置repeated中元素的值

    4)repeated修饰的对象类型:

    • add_属性名():返回可修改的属性类型对象的指针(集合中的一个元素),属性类型是指pb中定义的对象;
    • 属性名_size():获取集合大小;

    属性名(i):返回集合中某一个元素,返回的是只读的属性类型对象的引用,属性类型是指pb中定义的对象;

    • mutable_属性名(i):返回集合中某一个元素,返回的是可修改的属性类型对象的指针,属性类型是指pb中定义的对象;
    • 属性名():返回只读的整个集合的引用,集合类型是const ::google::protobuf::RepeatedPtrField< pb定义的对象>& XXX const;,可以使用iterator来迭代遍历;
    • mutable_属性名():返回可修改的整个集合的指针,集合类型是::google::protobuf::RepeatedPtrField< pb定义的对象>*,可以使用iterator来迭代遍历;

    序列化

    • required字段需要初始化,可以通过IsInitialized来检查是否完成message对象的初始化
    • SerializedAsString(),SerializedToString(std::string* output) 把meaage编码进output
    • SerializedToArray(void*,int)把message编码进数组buff
    • SerializedToOstream(ostream*)把message编码到输出流
    • ByteSize()获取二进制字节序的大小,可用于初始化存放容器

    反序列化

    • ParseFromString(std::string& data) 把data解码到message
    • ParseFromArray(char* buf,int size)把buf解码到message,效率比第一个快很多
    • ParseFromIstream(istream*)从istream输入流解码到message
    • has_xxx()用于检查相应字段是否存在数据
    • xxx_size()用于确定repeated字段是否存在,0表示未序列化

    总结

    本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注海外IDC网的更多内容!

    【文章由高防cdn http://www.juniucdn.com处的文章,转载请说明出处】