我正在構建插件體系結構。用戶可以構建自己的插件,並允許他們在protobuf
中放置自己的插件設置(我不知道用戶將在那裏放置什麼類型的用戶)。protobuf-net中的動態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
?