2012-04-07 60 views
2

我的問題是用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" 
    ... 
} 

回答

1

協議緩衝器設計使用他們的二進制格式時,但肯定的是當前的代碼並不指望解析文字是向前和向後兼容格式,未知字段。它可能會被改變來做到這一點,但我想檢查一下Java代碼,試圖保持與該代碼的一致性。

是否有任何原因您不使用二進制表示法開始?這是正常的預期用法,也是絕大多數工作已經進入的地方。(說了這一點,在距離代碼很遠的地方這一切似乎都有些模糊......)

+0

哇,我沒想到這麼快就有了答案!我很感激。感謝你的回答。這讓我瘋狂,我想我做錯了什麼......好吧,我想我必須以其他方式去做。再次感謝!當我在網絡中發送軟件包時,我使用二進制版本,並且它非常完美,但對於配置,我更喜歡文本版本(沒有人,沒有用於配置的xml文件,更可讀的proto版本)。 – chasques 2012-04-07 21:20:30

+0

@chasques:如果您查看最新版本,我們有一些JSON支持,您可能會發現它比文本格式支持更具可讀性。 *可能*支持未知字段 - 我不確定是否正式。 – 2012-04-07 21:57:55

+0

這可能是更新到新版本的一個很好的理由。我正在考慮用新的參數(proto的擴展參數)使用另一個文件,但json解決方案似乎更加優雅。我會檢查它。再次感謝! – chasques 2012-04-07 22:28:39

相關問題