类Descriptor
描述一种message类型(不是一个单独的message对象)的meta信息。构造函数是private类型,必须通过DescriptorPool(friend类)来构造。
const的成员:
const FileDescriptor* file_
: 描述message所在的.proto文件信息const Descriptor* containing_type_
:如果在proto定义中,这个message是被其它message所包含,那么这个字段是上一级message的descriptor*
;如果没有被包含,那么是NULLconst MessageOptions* options_
: 定义在descriptor.proto,从注释看是用来和老版本proto1中MessageSet做拓展,可以先不去关注涉及extension的部分。
非const的成员:
int field_count_
:当前field包含的field的个数FieldDescriptor* fields_
: 以连续数组方式保存的所有的fiedsint nested_type_count_
: 嵌套类型数量Descriptor* nested_types_
: message中嵌套messageint enum_type_count_
: 内部enum的个数EnumDescriptor* enum_types_
: enum类型的连续内存起始地址
类FileDescriptor
描述整个.proto文件信息,其中包含:
依赖.proto文件信息:
int dependency_count_;
const FileDescriptor** dependencies_;
当前.proto文件包含的message信息:
int message_type_count_;
Descriptor* message_types_;
当前.proto文件包含的所有symbol (各种descriptor)的tables:
const FileDescriptorTables* tables_;
类FieldDescriptor
描述一个单独的field,构造函数为private,也必须由DescriptorPool
(friend类)构造。通过包含这个field的message的descriptor的函数(Descriptor::FindFieldByName()
)获得。
enum类型:
enum Type : field类型;
enum CppType: cpp中field类型,CppType和Type类型映射关系是固定的;
enum Label :标记field的存在性类型(optional/required/repeated);
const类型的private数据:
const Descriptor* containing_type_;
const Descriptor* extension_scope_;
const Descriptor* message_type_;
const EnumDescriptor* enum_type_;
const FieldDescriptor* experimental_map_key_;
const FieldOptions* options_;
3个映射表(static const类型):
static const CppType kTypeToCppTypeMap[MAX_TYPE + 1];
static const char * const kTypeToName[MAX_TYPE + 1];
static const char * const kLabelToName[MAX_LABEL + 1];
在descriptor.cc中,实现对外暴露数据的函数时,为了提高代码可读性,使用了如下宏的方式:
PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_int32 , int32 )
PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, has_default_value, bool)
PROTOBUF_DEFINE_ACCESSOR
的定义如下:
// These macros makes this repetitive code more readable.
#define PROTOBUF_DEFINE_ACCESSOR(CLASS, FIELD, TYPE) \
inline TYPE CLASS::FIELD() const { return FIELD##_; }
因为FieldDescriptor自己包含如下union数据成员,用来表示不同TYPE类型数据的default值:
private:
bool has_default_value_;
union {
int32 default_value_int32_;
int64 default_value_int64_;
uint32 default_value_uint32_;
uint64 default_value_uint64_;
float default_value_float_;
double default_value_double_;
bool default_value_bool_;
const EnumValueDescriptor* default_value_enum_;
const string* default_value_string_;
};
类EnumDescriptor
描述在.proto文件中定义的enum类型
结构体Symbol
针对protobuf中7种类型的descriptor的一个封装。
编程上,也适用union来适配不同类型的descriptor:
Type type;
union {
const Descriptor* descriptor;
const FieldDescriptor* field