2

私の質問は、Google プロトコル バッファの C# 実装に関連しています (protobuf-csharp-port、jon skeet による、素晴らしい仕事です!)

拡張機能で問題が発生しています: 私が書いたとしましょう:

  • 「transport_file.proto」と「トランスポート メッセージ」、および
    それを処理するコード「code_old」。
  • 「Mytransport.proto」ファイルにトランスポート メッセージの拡張子を書き、それを読み取る新しいコード「code_new」を作成しました。

code_old が拡張子を無視することを期待して (MyTransport.proto から) 新しいメッセージを読み取ろうとしていますが、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"
  }
...

全体的なアイデアは、テキストベースのプロトコルバッファを構成ファイルとして使用して、いくつかのパラメーターを記述し、それらの1つに基づいてロードしてアセンブリすることです(新しい拡張子でメッセージ全体を読み取ります(オブジェクトを初期化するためのパラメーター)) .

何か案が?(切実な質問です: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"
    ...
 }
4

1 に答える 1

1

プロトコル バッファは、バイナリ形式を使用する場合に後方互換性と前方互換性があるように設計されていますが、現在のコードでは不明なフィールドを含むテキスト形式を解析することは想定していません。それを行うために変更される可能性がありますが、Javaコードを確認して、それとの同等性を維持したいと思います.

そもそもバイナリ表現を使用していない理由はありますか? これは通常の意図された使用法であり、大部分の作業が行われたものです。

于 2012-04-07T21:06:16.203 に答える