我可能忽略了一些東西,但我試圖將協議緩衝區轉換爲稍後提供擴展的簡單方法。這似乎有點不清楚,所以我會直接跳到問題。協議緩衝區擴展
我正在編寫一個程序集以支持各種任務,其中一個任務包括描述結構化數據。完美的時間使用協議緩衝區。使用協議緩衝區的主類稱爲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的某些東西 - > 有一個帶有「extend GraphicsStateDef」的protobuff文件來定義所需的狀態。
我希望定義「擴展GraphicsStateDef」將生成代碼,使我可以使用屬性來訪問這些字段,並避免繁瑣的「Extendible.AppendValue()」和GetValue()語法。
一個解決方案我設計,這似乎hackish的,是在引用的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,它應該描述這個狀態引用的狀態。目前,我試圖反序列化狀態緩衝區到不同的類(GraphicsStateDef),當我真的應該反序列化到狀態對象本身。
因此,我需要重新考慮設計,使StateDefinition成爲流的容器,併爲「重複的StateTypes requiredStates = 1」字段僅提取足夠的信息。然後,在引用程序集中,流的其餘部分可以反序列化到相應的狀態。
有沒有人有如何解決這個問題的建議?一些想法正在制定中,但沒有具體的,我很喜歡其他人的投入。
你使用protobuf網?擴展定義的代碼生成是否存在已知的問題? – Merritt 2009-08-15 03:49:07
是的,我正在使用protobuf網。不,我不知道,我會檢查。它甚至不是一個代碼生成問題,是我無法想象使用哪種語言機制來「完成」外部程序集中的類。部分班級工作很好,但拒絕跨越議會邊界。 – Quantumplation 2009-08-15 20:50:08
對我的編輯有什麼想法?我仍然不太確定我想如何解決這個問題。 – Quantumplation 2009-08-16 20:09:33