2010-11-04 132 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編寫自己的解串器)。