C++ Google Protobuf 反射技术基础API

使用过java的同学,可能会更容易理解反射的概念。C++语言级别里面并没有真正意义上的反射。google protobuf提供了的反射机制。可以让我们在没有对应数据的protobuf定义文件的时候,去操作数据。

反射相关的类和API

google::protobuf::Message

接口类,在类MessageLite的基础上增加了descriptors和reflection

//google::protobuf::Message
const Descriptor* GetDescriptor() const;
const Reflection* GetReflection() const;

google::protobuf::Descriptor

描述一种Message类型(不是一个单独的message对象)的meta信息

//Descriptor
//返回message的属性个数
int field_count() const;
//返回第index个属性
const FieldDescriptor* field(int index) const;
//通过proto文件里面定义的tag, 返回属性
const FieldDescriptor* FindFieldByNumber(int number) const;
//通过属性名,返回属性
const FieldDescriptor* FindFieldByName(const std::string& name) const;
//通过小写的属性名,返回属性
const FieldDescriptor* FindFieldByLowercaseName(
      const std::string& lowercase_name) const;
//通过驼峰属性名,返回属性
const FieldDescriptor* FindFieldByCamelcaseName(
      const std::string& camelcase_name) const;
//返回枚举类型的数量
int enum_type_count() const;
//返回第index个枚举类型属性
const EnumDescriptor* enum_type(int index) const;
//通过名称,返回枚举属性
const EnumDescriptor* FindEnumTypeByName(const std::string& name) const;
//通过属性值,返回枚举值属性
const EnumValueDescriptor* FindEnumValueByName(const std::string& name) const;

google::protobuf::Reflection

接口类,提供方法来动态访问/修改message中的field的接口类

//检查message中的非repeated属性是否存在
bool HasField(const Message& message, const FieldDescriptor* field) const;
//返回message中repeated属性的长度
int FieldSize(const Message& message, const FieldDescriptor* field) const;
//清除message中的属性,非repeated属性HashField返回false,repeated属性FieldSize返回0
void ClearField(Message* message, const FieldDescriptor* field) const;
//返回message中除Unknown的属性,包括所有HashField返回为true,FieldSize非0的属性
void ListFields(const Message& message,
                  std::vector<const FieldDescriptor*>* output) const;
//返回message对应属性的,对应类型的返回值
int32 GetInt32(const Message& message, const FieldDescriptor* field) const;
  int64 GetInt64(const Message& message, const FieldDescriptor* field) const;
  uint32 GetUInt32(const Message& message, const FieldDescriptor* field) const;
  uint64 GetUInt64(const Message& message, const FieldDescriptor* field) const;
  float GetFloat(const Message& message, const FieldDescriptor* field) const;
  double GetDouble(const Message& message, const FieldDescriptor* field) const;
  bool GetBool(const Message& message, const FieldDescriptor* field) const;
  std::string GetString(const Message& message,
                        const FieldDescriptor* field) const;
  const EnumValueDescriptor* GetEnum(const Message& message,
                                     const FieldDescriptor* field) const;

//返回message,属性的value的int类型值
int GetEnumValue(const Message& message, const FieldDescriptor* field) const;
const Message& GetMessage(const Message& message,
                            const FieldDescriptor* field,
                            MessageFactory* factory = nullptr) const;

//设置message,对应属性的对应类型的值
void SetInt32(Message* message, const FieldDescriptor* field,
                int32 value) const;
  void SetInt64(Message* message, const FieldDescriptor* field,
                int64 value) const;
  void SetUInt32(Message* message, const FieldDescriptor* field,
                 uint32 value) const;
  void SetUInt64(Message* message, const FieldDescriptor* field,
                 uint64 value) const;
  void SetFloat(Message* message, const FieldDescriptor* field,
                float value) const;
  void SetDouble(Message* message, const FieldDescriptor* field,
                 double value) const;
  void SetBool(Message* message, const FieldDescriptor* field,
               bool value) const;
  void SetString(Message* message, const FieldDescriptor* field,
                 const std::string& value) const;
  void SetEnum(Message* message, const FieldDescriptor* field,
               const EnumValueDescriptor* value) const;
  void SetEnumValue(Message* message, const FieldDescriptor* field,
                    int value) const;
  Message* MutableMessage(Message* message, const FieldDescriptor* field,
                          MessageFactory* factory = nullptr) const;

//返回message对应属性repeated字段的index位置的值
int32 GetRepeatedInt32(const Message& message, const FieldDescriptor* field,
                         int index) const;
  int64 GetRepeatedInt64(const Message& message, const FieldDescriptor* field,
                         int index) const;
  uint32 GetRepeatedUInt32(const Message& message, const FieldDescriptor* field,
                           int index) const;
  uint64 GetRepeatedUInt64(const Message& message, const FieldDescriptor* field,
                           int index) const;
  float GetRepeatedFloat(const Message& message, const FieldDescriptor* field,
                         int index) const;
  double GetRepeatedDouble(const Message& message, const FieldDescriptor* field,
                           int index) const;
  bool GetRepeatedBool(const Message& message, const FieldDescriptor* field,
                       int index) const;
  std::string GetRepeatedString(const Message& message,
                                const FieldDescriptor* field, int index) const;
  const EnumValueDescriptor* GetRepeatedEnum(const Message& message,
                                             const FieldDescriptor* field,
                                             int index) const;
  int GetRepeatedEnumValue(const Message& message, const FieldDescriptor* field,
                           int index) const;
  const Message& GetRepeatedMessage(const Message& message,
                                    const FieldDescriptor* field,
                                    int index) const;
//设置message的repeated属性的index位置对应类型的value的值
void SetRepeatedInt32(Message* message, const FieldDescriptor* field,
                        int index, int32 value) const;
  void SetRepeatedInt64(Message* message, const FieldDescriptor* field,
                        int index, int64 value) const;
  void SetRepeatedUInt32(Message* message, const FieldDescriptor* field,
                         int index, uint32 value) const;
  void SetRepeatedUInt64(Message* message, const FieldDescriptor* field,
                         int index, uint64 value) const;
  void SetRepeatedFloat(Message* message, const FieldDescriptor* field,
                        int index, float value) const;
  void SetRepeatedDouble(Message* message, const FieldDescriptor* field,
                         int index, double value) const;
  void SetRepeatedBool(Message* message, const FieldDescriptor* field,
                       int index, bool value) const;
  void SetRepeatedString(Message* message, const FieldDescriptor* field,
                         int index, const std::string& value) const;
  void SetRepeatedEnum(Message* message, const FieldDescriptor* field,
                       int index, const EnumValueDescriptor* value) const;
  void SetRepeatedEnumValue(Message* message, const FieldDescriptor* field,
                            int index, int value) const;
  Message* MutableRepeatedMessage(Message* message,
                                  const FieldDescriptor* field,
                                  int index) const;

google::protobuf::FieldDescriptor

Message类的具体属性的描述,包含类型,名称,label,tag,proto文件等等信息

  //是否是必须的
  bool is_required() const;  // shorthand for label() == LABEL_REQUIRED
  //是否是可选的
  bool is_optional() const;  // shorthand for label() == LABEL_OPTIONAL
  //是否是repeated
  bool is_repeated() const;  // shorthand for label() == LABEL_REPEATED
  //是否可以pack
  bool is_packable() const;  // shorthand for is_repeated() &&
                             //               IsTypePackable(type())
  //是否是packed
  bool is_packed() const;    // shorthand for is_packable() &&
                             //               options().packed()
  //是否是message
  bool is_map() const;       // shorthand for type() == TYPE_MESSAGE &&
                             // message_type()->options().map_entry()
 //属性在message的索引位置
 int index() const;

google::protobuf::UnknownFieldSet

保存协议中未知的属性集合

  //返回UnknownField的数量
  inline int field_count() const;
  //返回index位置的UnknownField
  inline const UnknownField& field(int index) const;
  //返回index位置的UnknownField指针,可修改
  inline UnknownField* mutable_field(int index);
  //添加UnknownField
  void AddVarint(int number, uint64 value);
  void AddFixed32(int number, uint32 value);
  void AddFixed64(int number, uint64 value);
  void AddLengthDelimited(int number, const std::string& value);
  std::string* AddLengthDelimited(int number);

  // Adds an unknown field from another set.
  void AddField(const UnknownField& field);

其他相关

C++ Google Protobuf 反射技术基础API
C++ 实用技术 – google protobuf反射技术 – 转成JSON格式
C++ 实用技术 – google protobuf反射技术 – 转成YAML格式

打赏 赞(4)
微信
支付宝
微信二维码图片

微信扫描二维码打赏

支付宝二维码图片

支付宝扫描二维码打赏

发表评论

邮箱地址不会被公开。 必填项已用*标注