私はおそらく何かを見落としていますが、後で拡張機能を提供するための簡単な方法にプロトコルバッファを取り組もうとしています。それは少し不明確に思えるので、私は直接問題に飛び込みます。
構造化データの記述を含むさまざまなタスクをサポートするアセンブリを作成しています。プロトコルバッファを使用する絶好のタイミング。プロトコルバッファを使用するプライマリクラスは、StateDefinitionと呼ばれます。これが私が思いついた.protoファイルです:
パッケージKannon.State; メッセージStateDefinition{ 列挙型StateTypes{ グラフィック=0; オーディオ=1; MIND = 2; 物理学=3; ネットワーク=4; GENERIC = 5; } 繰り返されるStateTypesrequiredStates= 1; オプションのGraphicsStateDefGraphics= 2; オプションのAudioStateDefAudio= 3; (等) } メッセージGraphicsStateDef{ 最大100までの拡張。 } メッセージAudioStateDef{ 最大100までの拡張。 } (等)
私の目標は、これらの_StateDefメッセージを、必要なフィールドで後で拡張できるようにすることでした。ただし、この拡張機能は、現在作成しているライブラリとは関係なく発生します。
Kagents.dll->StateDefinitionの解析などを処理します。
Kagents.dllを参照するもの->必要な状態を定義するための「extendGraphicsStateDef」を含むprotobuffファイルがあります。
「extendGraphicsStateDef」を定義すると、プロパティを使用してこれらのフィールドにアクセスし、面倒な「Extendible.AppendValue()」およびGetValue()構文を回避できるコードが生成されることを期待していました。
私が考案した解決策の1つは、ハックのようですが、次のような拡張メソッドを使用して、参照DLLでクラスを定義することです。
public static class GraphicsExt {{ 列挙型フィールド {{ someValue = 1、 someOtherValue = 2 } public static Int32 someValue(this State.GraphicsStateDef def) {{ Extensible.GetValue(def、Fields.someValue);を返します。 } public static void someValue(this State.graphicsStateDef def、Int32 value) {{ Extensible.AppendValue(def、fields.someValue、value); } }
誰かがもっと良い方法を考えることができれば、私は大いに義務づけられるでしょう。=)また、問題の説明がどれほど明確になったかわからないので、何か説明や情報があれば教えてください。=)
編集:それで、これについてよく考えて、私が問題に間違ってアプローチしていることに気づいた後。StateReferenceは、さまざまなGameStateのリストを格納することになっています。また、StateDefinitionを格納します。これは、この状態参照の状態を記述する必要があります。現在、状態バッファーを別のクラス(GraphicsStateDef)に逆シリアル化しようとしていますが、実際には状態オブジェクト自体に逆シリアル化する必要があります。
したがって、StateDefinitionがストリームのコンテナーになり、「繰り返されるStateTypes requiredStates = 1」フィールドに十分な情報のみを抽出するように、設計を再考する必要があります。次に、参照アセンブリで、ストリームの残りの部分をそれぞれの状態に逆シリアル化できます。
これにアプローチする方法について誰かが推奨事項を持っていますか?いくつかのアイデアが策定されていますが、具体的なものは何もありません。他の人の意見を取り入れたいと思います。