c# - protobuf-net 中的动态 protobuf 消息

标签 c# c++ protobuf-net

我正在构建插件架构。用户可以构建自己的插件,我允许他们将自己的插件设置放在 protobuf 中(我不知道用户会把什么类型放在那里)。

原型(prototype)消息:

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

最佳答案

经过进一步调查,我找到了解决此问题的方法。遗憾的是,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);

希望对遇到同样问题的人有所帮助。

关于c# - protobuf-net 中的动态 protobuf 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27380217/

相关文章:

c# - WebBrowser 控制焦点

c# - 在 C# 中,如何在编译时不知道类型的情况下访问用户定义类型的静态属性?

c# - 如何通过 ProtoBuf-net 使用 DateTimeKind 选项序列化 DateTime 字段

c# - protobuf-net 可以处理自动只读属性吗?

处置形式上的 C# 异步回调

c# - Javascript 警报不显示

c++ - vector resize()、push.back()、reserve() 方法

c++ struct does not name 类型错误

c++ - Meego应用如何添加通用导航栏?

c# - 使用 protobuf-net 生成器制作 PCL 友好的 C# 类