我的问题与谷歌协议缓冲区的 C# 实现有关(protobuf-csharp-port,作者 jon skeet,干得好!)
我遇到了扩展问题:假设我写道:
- “transport_file.proto”带有“传输消息”和一些
处理它的代码“code_old”。 - 我在“Mytransport.proto”文件上写了一个传输消息的扩展,以及读取它的新代码“code_new”。
我正在尝试读取一条新消息(来自 MyTransport.proto),其中 code_old 期望忽略扩展名,但我在 TextFormat 的合并方法中遇到异常:“transport”没有名为“whatever_new_field”的字段
Transport.Builder myAppConfigB = new Transport.Builder();
System.IO.StreamReader fich = System.IO.File.OpenText("protocolBus.App.cfg");
TextFormat.Merge(fich.ReadToEnd(),myAppConfigB);
fich.Close();
新的扩展文件如下所示:
...
Transport
{
TransportName: "K6Server_0"
DllImport: "protocolBus.Transports.CentralServer"
TransportClass: "K6Server"
K6ServerParams
{
K6Server { host: "85.51.11.23" port: 40069 }
Service: "TZinTalk"
...
}
}
...
而旧的,没有扩展:
...
Transport
{
TransportName: "K6Server_0"
DllImport: "Default"
TransportClass: "Multicast"
}
...
整个想法是使用基于文本的协议缓冲区作为配置文件,我在其中编写了一些参数,并基于其中一个加载和组装(它将使用新扩展名读取整个消息(初始化对象的参数) .
任何的想法?(这是一个绝望的问题:D)
我正在使用 MSVC# 2008Express 版本,protobuf-csharp-port 版本 0.9.1(总有一天我会升级一切)。
提前致谢。
我正在研究具有不同传输方式的非中心化发布-订阅消息框架(对于原型文件中的任何书面消息,我会自动创建一个发布和订阅者类)。默认情况下,我使用多播,但也包括广播和“ UDP 星”。我让扩展机制让人们使用它的 owm 配置参数添加新的传输,这些参数应该由我的主 code_old 读取(只是为了加载程序集)并让新的传输 (.dll) 再次读取它(完全)。好奇的?以前的,几乎可以使用的版本在http://protocolbus.casessite.org
更新 1
文本格式的扩展类型用括号括起来(很高兴知道,我不知道:D)所以我应该写:
[K6ServerParams]
{
K6Server { host: "85.51.11.23" port: 40069 }
Service: "TZinTalk"
...
}