2014-04-04 80 views
0

我想使用IXmlSerializable接口將一系列從單個抽象超類WorldObject派生的子類序列化爲XML。我不得不使用這個接口,因爲我希望類能夠訂閱一些事件,因爲它是反序列化的。IXmlSerializable抽象類創建異常

使用this答案,我想出了下面的代碼:

[XmlInclude(typeof(SubType1)) 
,XmlInclude(typeof(SubType2))] // etc, includes all subtypes 
public abstract class WorldObject : IComparable, IXmlSerializable 

public void WriteXml(System.Xml.XmlWriter writer) 
{ 
    Type[] extraTypes = new Type[8]; 
    // (...) adding types to array here 
    var worldObjectSerializer = new XmlSerializer(typeof(List<WorldObject>), extraTypes); 
} 

最後一行,其中XmlSerializer初始化拋出一個運行時錯誤:system.missingMethodException而:無法創建抽象類「Namespace.WorldObject」 。當我嘗試使用typeof(WorldObject)而不是typeof(List<WorldObject>)時,會引發同樣的錯誤。

我也嘗試將每個類中的XMLRoot設置爲與所示的here中相同的值,但錯誤仍然存​​在。

回答

1

我從來沒有找到擺脫異常的方法,但我找到了解決方法。該解決方案簡單地將自己的元素包裝類型作爲其名稱,調用WriteXml函數並寫入結束元素。

foreach (WorldObject wO in list) 
     { 
      writer.WriteStartElement(wO.GetType().ToString()); 

      wO.WriteXml(writer); 

      writer.WriteEndElement(); 
     } 

這使您可以反序列化抽象類的具體實現。 wO.GetType().ToString()用具體的類和名稱空間創建一個字符串。然後,您可以創建一個XmlSerializer,其中類型是從元素包裝器名稱中收集的,如下所示:

Type t = Type.GetType(reader.LocalName); 
XmlSerializer worldObjectSerializer = new XmlSerializer(t, new XmlRootAttribute(reader.LocalName));