我可能忽略了一些东西,但我试图将协议缓冲区转换为一种简单的方法,以便以后提供扩展。这似乎有点不清楚,所以我将直接进入这个问题。
我正在编写一个程序集来支持各种任务,其中之一包括描述结构化数据。使用协议缓冲区的最佳时机。使用协议缓冲区的主要类称为 StateDefinition。这是我为它设计的 .proto 文件:
包 Kannon.State; 消息状态定义 { 枚举状态类型 { 图形 = 0; 音频 = 1; 头脑 = 2; 物理 = 3; 网络 = 4; 通用 = 5; } 重复的 StateTypes requiredStates = 1; 可选 GraphicsStateDef 图形 = 2; 可选的 AudioStateDef 音频 = 3; (ETC) } 消息 GraphicsStateDef { 扩展 100 到最大; } 消息 AudioStateDef { 扩展 100 到最大; } (ETC)
我的目标是允许这些 _StateDef 消息稍后使用它需要的字段进行扩展。但是,此扩展将独立于我当前正在编写的库发生。
Kagents.dll -> 处理 StateDefinition 解析等。
引用 Kagents.dll 的东西 -> 有一个带有“扩展 GraphicsStateDef”的 protobuff 文件来定义所需的状态。
我希望定义“扩展 GraphicsStateDef”会生成允许我使用属性访问这些字段的代码,并避免繁琐的“Extendible.AppendValue()”和 GetValue() 语法。
我设计的一个解决方案,看起来很老套,是在引用 DLL 中定义一个带有扩展方法的类,如下所示:
公共静态类 GraphicsExt { 枚举字段 { 某个值 = 1, 一些其他值 = 2 } 公共静态 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 成为流的容器,并且只为“repeated StateTypes requiredStates=1”字段提取足够的信息。然后,在引用程序集中,可以将流的其余部分反序列化为相应的状态。
有没有人对如何解决这个问题有建议?一些想法正在形成,但没有具体的想法,我喜欢其他人的意见。