2014-12-09 128 views
2

我正在構建插件體系結構。用戶可以構建自己的插件,並允許他們在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

回答

0

經過進一步調查後,我找到了解決這個問題的辦法。令人遺憾的是,protobuf-net似乎不可能,但通過protobuf-sharp-port很容易。我已經替換庫,並從那裏喲可以像這樣訪問文件描述符。

-get文件描述符:

global::Google.ProtocolBuffers.DescriptorProtos.FileDescriptorProto fdp= global::Google.ProtocolBuffers.DescriptorProtos.FileDescriptorProto.ParseFrom(settings_descriptors); 

-get消息描述:

global::Google.ProtocolBuffers.Descriptors.MessageDescriptor descriptor= fdp.MessageTypes[0]; 

,並從那裏你可以得到動態消息:

Google.ProtocolBuffers.DynamicMessage dynamic_message = Google.ProtocolBuffers.DynamicMessage.GetDefaultInstance(descriptor); 

希望這將有助於某人同樣的問題。