私の質問は、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"
...
}