2010-11-04 133 views
1

我在XNA有一个2D游戏引擎,开发得很好。它的布局如下:C#XML序列化和涉及继承

一个中央GameManager,包含一个SceneObjectManagers列表(用于分层)。

SceneObjectManager包含SceneObjects的集合,它是一个抽象基类为对象的ID的字符串(即从列表inehrits,具有运算符[字符串]重载的类)。

有一个SceneObject2D和AnimatedSceneObject2D类,它们在链中继承(2D从SceneObject开始,从2D开始)。它们包含相关信息(位置,源矩形,动画等)。

然后我有第二个项目(使用引擎的实际游戏),它具有像PlayerObject,AIObject,FireballScript等,它从SceneObject2D和AnimatedSceneObject2D继承取决于它需要什么(如果它显示,动画,甚至都不)。

还有更多,但你得到的图片。

我已经开始解决一个关卡编辑器的想法,因为写出几百到几千实体发展的含量最高,并通过试验和错误或广泛的纸数学完美定位他们也只是疯狂。

相当简单的概念刷,选择实体,设置属性,并最终导出一个XML文件,其中包含每个实体,它们的位置和属性,ID等等。但问题在于XML序列化本身保存对象。

本质上,我会序列化GameManager,其中包含所有sceneobjectmanagers,其中包含所有场景对象。然后,我可以加载XML文件,这将是我的水平。但是接下来就存在继承问题,以及包含对象(和接口以及所有这些)的更复杂的对象。

对于每个将成为基类的类,我看不到自己写出[XmlInclude(typeof(T))],更不用说更复杂的对象了。

我开始继承IXmlSerializable,但在为所有我的对象写出WriteXml和ReadXml的努力之前,我想知道是否有更好,更简单的方法来解决这个问题。

我想指出它需要是可移植的格式(因此是XML),因为我想重新使用编辑器的导出,并进行了一些调整,以用于使用相同类布局的C++引擎(我正在考虑使用Boost.serialization)。

+0

NetDataContractSerializer解决了XmlSerializer的许多限制;如果可能的话,我建议你在XmlSerializer上使用它。 – Will 2010-11-04 20:02:12

回答

0

我最终使用了一个名为YAXLib的开源XML串行器。它在序列化时存储具体类的“真实”类型,并且设法序列化我的场景对象管理器集合。

当我将所有引擎移植到我的C++引擎后,我可以反序列化它们(由于之前的经验,我可能会使用TinyXML编写自己的解串器)。