C#XML序列化和涉及的继承

时间:2010-11-04 19:59:52

标签: c# inheritance xml-serialization

我在XNA中有一个2D游戏引擎,它的开发非常好。它的布局如下:

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

SceneObjectManager包含一个SceneObjects集合(一个从List中运行的类,运算符[string]重载),它是一个抽象基类,带有对象ID的字符串。

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

然后我有第二个项目(使用引擎的实际游戏),其中包含PlayerObject,AIObject,FireballScript等等,它们根据需要继承SceneObject2D和AnimatedSceneObject2D(如果它显示,动画或甚至都没有。)

还有更多内容,但是你得到了图片。

我已经开始着手处理关卡编辑器了,因为写出数百到数千个实体来构建一个级别并通过反复试验或者广泛的纸上数学来完美地定位它们只会是疯狂。

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

我可以稍后在我的C ++引擎中反序列化它们,一旦我将所有引擎移植(我可能会使用TinyXML编写我自己的反序列化器,因为之前的经验)。