protobuf-net 中的动态 protobuf 消息
Dynamic protobuf messages in 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
实现它?
经过进一步调查,我找到了这个问题的解决方案。可悲的是,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);
希望它能帮助有同样问题的人。
相关文章:
- 从 Any 包中提取和匹配 protobuf 消息类型名的首选方法
- protobuf,如何在protobuf消息中遍历所有集合字段,我不知道详细信息?(C++)
- 如何聚合protobuf消息
- C ++使用开关/大小写解析protobuf消息(减少重复代码)
- 编写多个 protobuf 消息:1 条具有 1 个重复属性的消息或编写不同的消息
- 动态生成Protobuf消息并将指针返回到它
- 在C++中更改现有protobuf消息的元素
- 将在64位应用程序中编码Protobuf消息并在32位应用程序中解码
- 解析来自固定大小字节缓冲区的连续块的protobuf消息序列
- C++中protobuf消息的长度前缀
- 是否可以在 protobuf 中发送编译的 protobuf 消息定义
- 遍历所有字段并在 protobuf 消息中获取它们的值
- 动态创建新的 protobuf 消息
- protobuf-net 中的动态 protobuf 消息
- 如何在解析文本格式的 protobuf 消息时忽略错误的字段
- 在Windows上从文件中读取多个分隔的protobuf消息
- 从部分google protobuf消息中检索信息
- 打印Protobuf消息时省略字段
- 通过winpcap API读取protobuf消息
- 在Java中编写带分隔符的c++ Protobuf消息和读取