我可能忽略了一些东西,但我试图将协议缓冲区转换为一种简单的方法,以便以后提供扩展。这似乎有点不清楚,所以我将直接进入这个问题。
我正在编写一个程序集来支持各种任务,其中之一包括描述结构化数据。使用协议缓冲区的最佳时机。使用协议缓冲区的主要类称为 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”字段提取足够的信息。然后,在引用程序集中,可以将流的其余部分反序列化为相应的状态。
有没有人对如何解决这个问题有建议?一些想法正在形成,但没有具体的想法,我喜欢其他人的意见。