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

标签 c# protocol-buffers protobuf-net

我的问题与谷歌 Protocol Buffer 的 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"
  }
...

整个想法是使用基于文本的 Protocol Buffer 作为我在其中编写一些参数的配置文件,并基于我加载和组装的其中一个(它将读取具有新扩展名的整个消息(要初始化的参数对象)。

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

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

提前致谢。


我正在使用不同的传输方式开发一个非中心化的消息发布-订阅框架(对于原型(prototype)文件中的任何书面消息,我会自动创建一个发布和一个订阅者类)。默认情况下,我使用多播,但也包括广播和“UDP 星”。我让扩展机制允许人们使用它的 owm 配置参数添加新的传输,这些参数应该由我的主要代码_old 读取(只是为了加载程序集)并让新的传输(.dll)再次(完全)读取它。 好奇的?以前的几乎可以正常使用的版本在 http://protocolbus.casessite.org

更新 1

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

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

最佳答案

Protocol Buffer 被设计为在使用它们的二进制 格式时向后和向前兼容,但当然当前代码不希望解析具有未知字段的文本 格式.它可能会被更改为这样做,但我想检查 Java 代码以尝试保持与它的奇偶校验。

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

关于c# - 如何使用旧代码读取扩展.proto 文件(textformat.merge)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10058337/

相关文章:

c# - 插入重复值 linq

C++ 谷歌 Protocol Buffer : assign binary stream to protobuf object

go - 两种不同语言之间的 Protocol Buffer

protobuf-net - 我们如何识别一个文件是否被 protobuf 序列化?

go - 是否需要通过 gprc 流客户端重新创建新流?

c# - 是否可以通过生成 .proto 文件使用 python 反序列化在 c# 中使用 protobuf-net 序列化的对象?

c# - NHibernate:你总是需要提交吗?它在读取时实际上做了什么?

c# - 从 bat 文件运行 Java .jar 和 Windows .exe

c# - 如何获取我试图在 IModelBinder 中绑定(bind)的参数的属性?

go - 无法使用 protobuf 解码字节