1.用DescriptorPool: :generated_pool() 找到一个DescriptorPool对象,它包含了程序编译的时候所链接的全部Protobuf Message types。 2.根据type name用DescriptorPool: :FindMessageTypeByName()查找Descriptor。 3.再用MessageFactory: :generated_factory() 找到MessageFactory对象,它能创建程序编译的时候所链接的全部Prot...
/* 反射创建实例 */auto descriptor = google::protobuf::DescriptorPool::generated_pool()->FindMessageTypeByName("Dog"); auto prototype = google::protobuf::MessageFactory::generated_factory()->GetPrototype(descriptor); auto instance = prototype->New();/* 反射相关接口 */auto reflecter = instance...
const DescriptorPool* pool = DescriptorPool::generated_pool(); DescriptorDatabase* db = pool->internal_generated_database(); if (db == nullptr) { return; } std::vector<std::string> file_names; db->FindAllFileNames(&file_names); // 遍历得到所有proto文件名 for (const std::string& fi...
google::protobuf::DescriptorPool::generated_pool()->FindMessageTypeByName(type_name); if(descriptor) { //利用Descriptor拿到类型注册的instance. 这个是不可修改的. constgoogle::protobuf::Message* prototype = google::protobuf::MessageFactory::generated_factory()->GetPrototype(descriptor); if(prototype...
那么如果我们没有编译时候的类型信息,我们希望 runtime 通过一个 type erased 的类型获得相关的 descriptor 的话,可以依赖 descriptor pool,事实上 proto2::DescriptorPool 提供的 API 可以做非常多的事情,我们这里仅仅讨论一个对应的实现 DescriptorPool::generated_pool() 所返回的 pool 可以用来查询当前 binary ...
FileDescriptorProto 就是我们要找的AST结构/* 反射创建实例 */auto descriptor = google::protobuf::DescriptorPool::generated_pool()->FindMessageTypeByName("Dog"); auto prototype = google::protobuf::MessageFactory::generated_factory()->GetPrototype(descriptor); ...
Message* createMessage(conststd::string& typeName){Message* message = NULL;constDescriptor* descriptor = DescriptorPool::generated_pool()->FindMessageTypeByName(typeName);if(descriptor){constMessage* prototype = MessageFactory::generated_factory()->GetPrototype(descriptor);if(prototype){message = prototy...
(1)1.用DescriptorPool: : generated_pool() 找到一个DescriptorPool对象,它包含了程序编译的时候所链接的全部Protobuf Message types。 (2)根据type name用DescriptorPool: :FindMessageTypeByName()查找Descriptor。 (3)再用MessageFactory: : generated_factory() 找到MessageFactory对象,它能创建程序编译的时候所链...
constDescriptor* descriptor = DescriptorPool::generated_pool()->FindMessageTypeByName(typeName); if(descriptor) { constMessage* prototype = MessageFactory::generated_factory()->GetPrototype(descriptor); if(prototype) { message = prototype->New(); ...
1、所有的Descriptor存储在单例的DescriptorPool 中。 google::protobuf::DescriptorPool::generated_pool()来获取他的指针。 2、所有的instance 存储在单例的MessageFactory中。 google::protobuf::MessageFactory::generated_factory()来获取他的指针。 3、将所有的Descriptor & instance 提前维护到表中备查 Descri...