我的問題是用C#實現谷歌的協議緩衝區的相關如何用舊代碼讀取擴展名.proto文件(textformat.merge)?
我遇到了擴展的煩惱(的protobuf-CSHARP端口,通過喬恩斯基特,偉大的工作!):比方說,我寫道:
- 「transport_file.proto」帶有「傳輸消息」,並且一些代碼可以處理它「code_old」到
。 - 我在 「Mytransport.proto」文件中編寫了傳輸消息的擴展名,並且新代碼將其讀取爲「code_new」。
我試圖與code_old期待忽略延伸閱讀新郵件(來自MyTransport.proto),但我得到了來自的TextFormat合併方法的異常:「運輸」有沒有命名的字段「 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"
}
...
整個想法是使用基於文本的協議緩衝區作爲一個配置文件,在其中我寫了一些參數,並基於我加載和彙編(這將讀取整個消息與新的擴展(params初始化對象)。
任何想法?(這是一個絕望的問題:D)
我正在使用MSVC#2008Express版本,protobuf-csharp端口版本0.9.1(有一天我會升級一切)。
感謝提前。
我工作的一個非(在原文件I自動對任何書面郵件中創建發佈和訂閱類)centrilized發佈 - 訂閱消息的框架,不同的傳輸。默認情況下,我使用多播,但也包括廣播和「UDP明星」。我讓擴展機制讓人們使用它的owm config參數添加新的傳輸,這些參數應該由我的主code_old(僅用於加載程序集)讀取,並讓新的傳輸(.dll)再次讀取(完全)。 好奇嗎?以前,幾乎功能,版本是http://protocolbus.casessite.org
更新1
文本格式的擴展類型,在方括號(好知道,我沒有意識到這一點:d),所以我應該寫:
[K6ServerParams]
{
K6Server { host: "85.51.11.23" port: 40069 }
Service: "TZinTalk"
...
}
哇,我沒想到這麼快就有了答案!我很感激。感謝你的回答。這讓我瘋狂,我想我做錯了什麼......好吧,我想我必須以其他方式去做。再次感謝!當我在網絡中發送軟件包時,我使用二進制版本,並且它非常完美,但對於配置,我更喜歡文本版本(沒有人,沒有用於配置的xml文件,更可讀的proto版本)。 – chasques 2012-04-07 21:20:30
@chasques:如果您查看最新版本,我們有一些JSON支持,您可能會發現它比文本格式支持更具可讀性。 *可能*支持未知字段 - 我不確定是否正式。 – 2012-04-07 21:57:55
這可能是更新到新版本的一個很好的理由。我正在考慮用新的參數(proto的擴展參數)使用另一個文件,但json解決方案似乎更加優雅。我會檢查它。再次感謝! – chasques 2012-04-07 22:28:39