我可能忽略了什么,但我试图将协议缓冲区转换为提供扩展的简单方法。这似乎有点不清楚,所以我直接跳到问题上。
我正在编写一个程序集来支持各种任务,其中之一包括描述结构化数据。使用协议缓冲区的完美时机。使用协议缓冲区的主要类别称为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; (等等) }
message GraphicsStateDef { extensions 100 to max; }
message AudioStateDef { extensions 100 to max; } (等等)
我的目标是允许那些_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,该定义应描述此状态引用的状态。当前,我尝试将状态缓冲区反序列化为不同的类(GraphicsStateDef),而实际上应该反序列化为状态对象本身。
因此,我需要重新考虑设计,使StateDefinition成为流的容器,并仅提取“repeated StateTypes requiredStates=1”字段所需的足够信息。然后,在引用程序集中,其余部分的流可以反序列化为相应的状态。
有没有人对如何解决这个问题有建议?有一些想法正在形成,但还没有具体的方案,我很希望得到其他人的意见。
我正在编写一个程序集来支持各种任务,其中之一包括描述结构化数据。使用协议缓冲区的完美时机。使用协议缓冲区的主要类别称为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; (等等) }
message GraphicsStateDef { extensions 100 to max; }
message AudioStateDef { extensions 100 to max; } (等等)
我的目标是允许那些_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,该定义应描述此状态引用的状态。当前,我尝试将状态缓冲区反序列化为不同的类(GraphicsStateDef),而实际上应该反序列化为状态对象本身。
因此,我需要重新考虑设计,使StateDefinition成为流的容器,并仅提取“repeated StateTypes requiredStates=1”字段所需的足够信息。然后,在引用程序集中,其余部分的流可以反序列化为相应的状态。
有没有人对如何解决这个问题有建议?有一些想法正在形成,但还没有具体的方案,我很希望得到其他人的意见。