我可能忽略了一些东西,但我试图将协议缓冲区转换为稍后提供扩展的简单方法。这似乎有点不清楚,所以我会直接跳到问题。协议缓冲区扩展
我正在编写一个程序集以支持各种任务,其中一个任务包括描述结构化数据。完美的时间使用协议缓冲区。使用协议缓冲区的主类称为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