おそらく何か見落としているかもしれませんが、プロトコルバッファーを後で拡張機能を提供する簡単な方法に挑戦しようとしています。それは少し不明なようですので、私は直接問題にジャンプします。拡張プロトコルバッファー
私は様々なタスクをサポートするためのアセンブリを作成しています。その中には、構造化データの記述が含まれています。プロトコルバッファを使用するのに最適な時間。プロトコルバッファを使用する主要なクラスは、StateDefinitionと呼ばれます。ここで私はそれのために思い付いた.protoファイルがあります:
package Kannon.State; message StateDefinition { enum StateTypes { GRAPHICS = 0; AUDIO = 1; MIND = 2; PHYSICS = 3; NETWORK = 4; GENERIC = 5; } repeated StateTypes requiredStates = 1; optional GraphicsStateDef Graphics = 2; optional AudioStateDef Audio = 3; (etc) } message GraphicsStateDef { extensions 100 to max; } message AudioStateDef { extensions 100 to max; } (etc)
私の目標は、それらの_StateDefメッセージは、それが必要になるかの分野で、後に拡張することができるようにすることでした。しかし、この拡張は、私が現在書いているライブラリとは独立して起こります。
Kagents.dll - > StateDefinitionの解析などを処理します。
何かを参照するKagents.dll - > 必要な状態を定義するために "GraphicsStateDefを拡張する" protobuffファイルがあります。
「GraphicsStateDefを拡張する」と定義すると、プロパティを使用してこれらのフィールドにアクセスし、面倒な「Extendible.AppendValue()」およびGetValue()構文を避けるコードが生成されることを期待していました。ハックようだ私が考案し
一つの解決策は、これと同様に、拡張メソッドで参照するDLL内のクラスを定義することです:
public static class GraphicsExt { enum Fields { someValue = 1, someOtherValue = 2 } public static Int32 someValue(this State.GraphicsStateDef def) { return Extensible.GetValue(def, Fields.someValue); } public static void someValue(this State.graphicsStateDef def, Int32 value) { Extensible.AppendValue(def, fields.someValue, value); } }
誰もがより良い方法を考えることができる場合、私は多くの義務だろう。 =) また、問題の説明がどれほど明白になったのかよくわからないので、私が提供できる情報があればお知らせください。 =)
編集: だから、これについてたくさん考えて、私が間違った問題に近づいていることに気付いた。 StateReferenceは、異なるGameStateのリストを格納することになっています。また、StateDefinitionも格納されています。StateDefinitionは、この状態参照の状態を記述する必要があります。現在、状態バッファーを別のクラス(GraphicsStateDef)にデシリアライズしようとしていますが、実際には状態オブジェクト自体にデシリアライズする必要があります。
したがって、StateDefinitionがストリームのコンテナになり、 "repeated StateTypes requiredStates = 1"フィールドの情報だけを抽出するように設計を再考する必要があります。次に、参照アセンブリでは、残りのストリームをそれぞれの状態にデシリアライズすることができます。
これにどのようにアプローチするのかとお考えの方はいらっしゃいますか?いくつかのアイデアが策定されていますが、具体的なものはありません。私は他のアイデアが大好きです。
protobuf-netを使用していますか?拡張定義のコード生成に関する既知の問題はありますか? – Merritt
はい、私はprotobuf-netを使用しています。そして、私が知っていることではないが、私はチェックするだろう。コード生成の問題もそれほどではありません。外部アセンブリのクラスを「終了」するために使用する言語メカニズムを考えることができません。部分クラスはうまくいくが、アセンブリの境界を越えることを拒否する。 – Quantumplation
私の編集に関する考えは?どのように私はこれに近づきたいのかまだよく分かりません。 – Quantumplation