protobuf-net 中的动态 protobuf 消息
Posted
技术标签:
【中文标题】protobuf-net 中的动态 protobuf 消息【英文标题】:Dynamic protobuf messages in protobuf-net 【发布时间】:2014-12-09 13:35:21 【问题描述】:我正在构建插件架构。用户可以构建自己的插件,我允许他们将自己的插件设置放在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++):
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
?
【问题讨论】:
【参考方案1】:经过进一步调查,我找到了解决此问题的方法。遗憾的是,使用 protobuf-net 似乎不可能,但使用 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];
从那里你可以得到动态消息:
Google.ProtocolBuffers.DynamicMessage dynamic_message = Google.ProtocolBuffers.DynamicMessage.GetDefaultInstance(descriptor);
希望它能帮助遇到同样问题的人。
【讨论】:
以上是关于protobuf-net 中的动态 protobuf 消息的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Protobuf-net 中动态添加 Proto 成员
Protobuf-net 尝试 JIT 编译方法'(包装器动态方法)ClassExtensions.StringArray