C# protobuf网络中的动态protobuf消息
我正在构建插件架构。用户可以构建自己的插件,我允许他们将自己的插件设置放在C# protobuf网络中的动态protobuf消息,c#,c++,protobuf-net,C#,C++,Protobuf Net,我正在构建插件架构。用户可以构建自己的插件,我允许他们将自己的插件设置放在protobuf中(我不知道用户会放什么类型的插件) Protos消息: message pbPlugin{ required string id = 1; required string type = 2; optional bytes settings = 3; optional bytes settings_descriptor= 4; } message pbMyPluginSe
protobuf
中(我不知道用户会放什么类型的插件)
Protos消息:
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++):
因此,用户正在制作自己的protobuf
消息,他正在序列化它,并将其放入pbPlugin
消息的设置字段中,同时他正在序列化此消息描述符
现在在客户端(c#应用程序),我将返回我的pbPlugin
消息,我想反序列化设置字段,并更改曝光和像素时钟。我的问题是不知道如何在不知道消息类型的情况下反序列化消息?在协议网络中是否可能
<> > C++中,我使用序列化的描述符和<代码> DealMeCaseMauleStudio<代码>来创建消息,将反序列化设置放入./P>
DynamicMessageFactory dmf;
Message* actual_msg = dmf.GetPrototype(deserialized_descriptor)->New();
这样我可以访问和更改字段值。
我怎样才能实现它呢?经过进一步的调查,我找到了这个问题的解决方案。遗憾的是,使用protobuf网络似乎不可能,但使用protobuf sharp port却很容易。我已经替换了库,从那个里你们可以像这样访问文件描述符
-获取文件描述符:
global::Google.ProtocolBuffers.DescriptorProtos.FileDescriptorProto fdp= global::Google.ProtocolBuffers.DescriptorProtos.FileDescriptorProto.ParseFrom(settings_descriptors);
global::Google.ProtocolBuffers.Descriptors.MessageDescriptor descriptor= fdp.MessageTypes[0];
-获取消息描述符:
global::Google.ProtocolBuffers.DescriptorProtos.FileDescriptorProto fdp= global::Google.ProtocolBuffers.DescriptorProtos.FileDescriptorProto.ParseFrom(settings_descriptors);
global::Google.ProtocolBuffers.Descriptors.MessageDescriptor descriptor= fdp.MessageTypes[0];
从那里您可以获得动态消息:
Google.ProtocolBuffers.DynamicMessage dynamic_message = Google.ProtocolBuffers.DynamicMessage.GetDefaultInstance(descriptor);
希望它能帮助有同样问题的人