2014-12-09 72 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); 

希望这将有助于某人同样的问题。