2015-04-30 2 views
2

У меня есть много сообщений protobuf, для которых я в настоящее время использую написанную вручную функцию поиска для генерации сообщения по его названию. Поскольку сообщения становятся все больше и больше по мере развития проекта, я устаю поддерживать этот код поиска вручную.Создание объекта сообщения Protobuf по имени

Итак, есть ли способ автоматизировать этот процесс? Может быть, с плагином protoc, который добавляет некоторый код в код protobuf, чтобы он мог зарегистрироваться?

+0

Существует механизм использования дескрипторов сообщений, которые обеспечивают создание типов сообщений и полей с использованием именных строк IIRC. –

ответ

4

Библиотека C++ Protobuf уже поддерживает пул «дескрипторов» для всех типов, скомпилированных в двоичный файл.

https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.descriptor#DescriptorPool.generated_pool.details

Итак, вы могли бы сделать:

google::Protobuf::Descriptor* desc = 
    google::protobuf::DescriptorPool::generated_pool() 
     ->FindMessageTypeByName("mypkg.MyType"); 
assert(desc != NULL); 

Библиотека также поддерживает объект, который может быть использован для создания экземпляров любого скомпилированных типа, учитывая его дескриптор:

https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.message#MessageFactory.generated_factory.details

Таким образом, вы бы сделали:

google::protobuf::Message* message = 
    google::protobuf::MessageFactory::generated_factory() 
     ->GetPrototype(desc)->New(); 
0

Вряд ли этот подход не может использоваться как общий способ создания любого экземпляра сообщения. Описание типа сообщения появляется в generated_pool() только после того, как сообщение этого типа было создано хотя бы один раз (например, в момент MyMessageType* msg = new MyMessageType()), поэтому FindMessageTypeByName никогда не находит тип сообщения, которое еще не было создано.

Смежные вопросы