Динамические сообщения protobuf в protobuf-netC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Динамические сообщения protobuf в protobuf-net

Сообщение Anonymous »

Я создаю архитектуру плагинов. Пользователи могут создавать собственные плагины, и я разрешаю им помещать свои собственные настройки плагина в protobuf (я не знаю, какой тип пользователи будут туда помещать).

Протосообщения:

Код: Выделить всё

message pbPlugin{
required string id = 1;
required string type = 2;
optional bytes settings = 3;
optional bytes settings_descriptor= 4;
}

message pbMyPluginSetting{
optional double exposure=1;
optional int32 pixel_clock=2;
}
Серверная часть (C++):

Код: Выделить всё

int main(int argc, char *argv[])
{
pbPlugin* pb_plugin;

pbMyPluginSetting plugin_settings; //it's user class i don't know it
plugin_settings.set_exposure(7);
plugin_settings.set_pixel_clock(28);

void *plugin_settings_buffer = malloc(plugin_settings.ByteSize());
plugin_settings.SerializeToArray(plugin_settings_buffer , plugin_settings.ByteSize());

pbPlugin->set_settings(plugin_settings_buffer , plugin_settings.ByteSize());

const Descriptor* desc=plugin_settings.GetDescriptor();
void *plugin_settings_desc_buffer = malloc(desc.ByteSize());
plugin_settings.SerializeToArray(plugin_settings_desc_buffer , desc.ByteSize());

pbPlugin->settings_descriptor(plugin_settings_desc_buffer , desc.ByteSize());
}
Итак, пользователь создает свое собственное сообщение protobuf, сериализует его и помещает в поле настроек сообщения pbPlugin, а также сериализует этот дескриптор сообщения.

Теперь на стороне клиента (приложение C#) я получаю обратно сообщение pbPlugin и хочу десериализовать поле настройки и изменить экспозицию и Pixel_Clock. Моя проблема в том, что я не знаю, как десериализовать сообщение, не зная его типа? Возможно ли это в protobuf-net?

В C++ я бы использовал сериализованный дескриптор и DynamicMessageFactory для создания сообщения для помещения десериализованных настроек.

Код: Выделить всё

DynamicMessageFactory dmf;
Message* actual_msg = dmf.GetPrototype(deserialized_descriptor)->New();
Таким образом я могу получать доступ к значениям полей и изменять их.
Как я могу добиться этого в protobuf-net?

Подробнее здесь: https://stackoverflow.com/questions/273 ... otobuf-net
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»