Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用旧代码读取扩展名.proto文件(textformat.merge)?_C#_Protocol Buffers_Protobuf Net - Fatal编程技术网

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

C# 如何使用旧代码读取扩展名.proto文件(textformat.merge)?,c#,protocol-buffers,protobuf-net,C#,Protocol Buffers,Protobuf Net,我的问题与google协议缓冲区的C#实现有关(protobuf csharp port,由jon skeet编写,非常好!) 我在扩展方面遇到了问题:假设我写了: “transport_file.proto”,带有“传输消息”和一些代码,用于 处理它“代码旧” 我在上写了一个传输消息的扩展 “Mytransport.proto”文件,以及读取该文件的新代码“code\u new” 我试图读取一条新消息(来自MyTransport.proto),代码为旧,希望忽略扩展名,但我在TextFor

我的问题与google协议缓冲区的C#实现有关(protobuf csharp port,由jon skeet编写,非常好!)

我在扩展方面遇到了问题:假设我写了:

  • “transport_file.proto”,带有“传输消息”和一些代码,用于
    处理它“代码旧”
  • 我在上写了一个传输消息的扩展 “Mytransport.proto”文件,以及读取该文件的新代码“code\u new”
我试图读取一条新消息(来自MyTransport.proto),代码为旧,希望忽略扩展名,但我在TextFormat的merge方法中遇到一个异常:“transport”没有名为“whatever\u new\u field”的字段

新的扩展文件如下所示:

...
  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用于初始化对象)

有什么想法吗?(这是一个令人绝望的问题:D)

我使用的是MSVC#2008Express edition,protobuf csharp端口版本0.9.1(总有一天我会升级所有东西)

提前谢谢


我正在开发一个非中心化的消息发布-订阅框架(对于原始文件中的任何书面消息,我会自动创建一个发布和订户类),使用不同的传输。默认情况下,我使用多播,但使用广播和“UDP星形”我让扩展机制允许人们添加带有owm配置参数的新传输,这些参数应该由我的主代码读取(仅用于加载程序集),并让新传输(.dll)再次(完全)读取。 好奇?上一个几乎是功能性的版本正在使用中

更新1

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

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

协议缓冲区在使用二进制格式时被设计为前后兼容,但是当前的代码当然不希望解析带有未知字段的文本格式。它可能会被更改以实现这一点,但我想检查Java代码,以尝试保持与该格式的奇偶性


有什么理由不首先使用二进制表示法吗?这是正常的预期用途,也是绝大多数工作都用到的地方。(话虽如此,在远离代码这么久之后,这一切似乎有点模糊…)

Wow man,我没想到这么快就能得到答案!我很感激。谢谢你的回答。这让我发疯了,我觉得我做错了什么……我想我必须用其他方式来做。再次感谢!我在网上发送软件包时使用二进制版本,非常适合,但对于配置,我更喜欢文本版本(没有人,配置没有xml文件,原型版本可读性更高)@chasques:如果你看一下最新版本,我们有一些JSON支持,你可能会发现它比文本格式支持更可读。这可能支持未知字段-我现在不确定。这可能是更新到新版本的一个很好的理由。我正在考虑使用另一个带有新参数的文件(proto的扩展参数)但是json解决方案似乎更优雅。我会检查它。再次感谢!嗨,只需要几行代码就可以让这件事变得更清楚:我确实更新了你的库,这比我想象的要容易得多,而且我确实尝试使用json格式化程序JsonFormatReader获得同样的结果。所以,不要再找借口偷懒了:我一直在钻研代码,我已经做到了得出一些结论:1 .-C版本(我猜,java版本也一样):如果没有注册扩展或没有注册表,则抛出异常!!2!-C++版本:在没有发现扩展的情况下(没有扩展或没有注册表)返回false并继续解析消息,然后使用日志或errorcollector通知(ReportError),但不停止解析器(对扩展中的每个字段重复错误/日志通知(对此不是很确定))。因此,在这种情况下,可以读取具有未知扩展名的文本格式邮件。我正在尝试使用“n~apa”(西班牙语表示简单但不太好的工程解决方案)修改TextFormat.cs,以实现我的私人功能。再次感谢。
 [K6ServerParams]
 {
    K6Server { host: "85.51.11.23" port: 40069 }
    Service: "TZinTalk"
    ...
 }