如何用旧代码读取扩展名.proto文件(textformat.merge)?

时间:2012-04-07 20:59:56

标签: c# protocol-buffers protobuf-net

我的问题与谷歌协议缓冲区的C#实现有关(protobuf-csharp-port,jon双向飞碟,很棒!)

我遇到了扩展的麻烦:让我们说我写道:

  • “transport_file.proto”带有“传输消息”和一些代码到
    处理它“code_old”。
  • 我写了一个传输消息的扩展名 “Mytransport.proto”文件,以及读取它的新代码“code_new”。

我正在尝试读取一条新消息(来自MyTransport.proto),其中code_old期望忽略扩展名,但我在TextFormat的merge方法中得到一个异常:“transport”没有名为“whatever_new_field”的字段< / p>

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"
  }
...

整个想法是使用基于文本的协议缓冲区作为配置文件,我在其中编写一些参数,并基于其中一个加载和汇编(将使用新扩展读取整个消息(params to initialize)对象)。

任何想法?(这是一个绝望的问题:D)

我正在使用MSVC#2008Express版本,protobuf-csharp-port版本0.9.1(有一天我会升级所有内容)。

提前感谢。


我正在研究一个非中心化的Publish-Subscribe消息框架(用于原型文件中的任何书面消息,我自动创建一个Publish和Subscriber类),具有不同的传输。默认情况下,我使用多播,但广播和“ UDP星”也包括在内。我让扩展机制让人们添加新的传输,其owm配置参数应由我的主code_old读取(只是为了加载程序集)并让新传输(.dll)再次读取它(完全)。 好奇?以前几乎功能齐全的版本位于http://protocolbus.casessite.org

更新1

文本格式的扩展类型用括号括起来(很高兴知道,我不知道它:D)所以我应该写一下:

 [K6ServerParams]
 {
    K6Server { host: "85.51.11.23" port: 40069 }
    Service: "TZinTalk"
    ...
 }

1 个答案:

答案 0 :(得分:1)

协议缓冲区在使用二进制格式时设计为向后兼容,但当前代码当然不希望用未知字段解析 text 格式。它可能会被改变以做到这一点,但我想检查Java代码以尝试保持奇偶校验。

你有没有理由不使用二进制表示开头?这是正常的预期用途,也是绝大部分工作进入的用途。(说到这一点,在远离代码的情况下看起来有点模糊......)