如何使用旧代码读取扩展名 .proto 文件 (textformat.merge)
本文关键字:文件 textformat merge proto 扩展名 何使用 代码 读取 | 更新日期: 2023-09-27 18:30:17
我的问题与谷歌协议缓冲区的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 星"。我让扩展机制让人们使用我的主code_old读取的 owm 配置参数添加新的传输(只是为了加载程序集),并让新的传输 (.dll) 再次读取它(完全)。好奇?上一个几乎功能齐全的版本正在 http://protocolbus.casessite.org
更新 1
文本格式的扩展类型括在括号中(很高兴知道,我:D不知道),所以我应该写:
[K6ServerParams]
{
K6Server { host: "85.51.11.23" port: 40069 }
Service: "TZinTalk"
...
}
协议缓冲区在使用其二进制格式时被设计为向后和向前兼容,但当然当前代码不希望使用未知字段解析文本格式。它可能会被更改以执行此操作,但我想检查 Java 代码以尝试保持与之奇偶校验。
有什么理由不首先使用二进制表示吗?这是正常的预期用途,也是绝大多数工作都投入的用途。(话虽如此,在离开代码这么久之后,这一切似乎有点模糊......