2013-10-23 92 views
6

我無法使用XML序列化將動物列表保存到磁盤。列表的XML序列化<Object>

我得到異常:引發:「不需要類型AnimalLibrary.Animals.Mammals.Dog。使用XmlInclude或SoapInclude屬性指定靜態未知的類型。」 (System.InvalidOperationException)

如果我嘗試帶有「Dog」的註釋代碼,它將按預期工作,並生成XML。但是,作爲列表中唯一元素的同一條狗不起作用。

[XmlElement("animalList")] 
    public List<Animal> animalList = new List<Animal>(); 

public bool SaveBinary(string fileName) 
    { 
     Mammals.Dog dog = (Mammals.Dog)animalList[0]; 

     //IObjectSerializer<Mammals.Dog> obj = new XMLObjectSerializer<Mammals.Dog>(); 
     IObjectSerializer<List<Animal>> obj = new XMLObjectSerializer<List<Animal>>(); 

     bool saved = obj.SaveFile(fileName, animalList); 
     if (saved) 
      return true; 

     return false; 
    } 

XML序列化

public bool SaveFile(string fileName, T objectToSerialize) 
    { 
     try 
     { 
      //Will overwrite old file 
      XmlSerializer mySerializer = new XmlSerializer(typeof(T)); 

      StreamWriter myWriter = new StreamWriter(fileName); 
      mySerializer.Serialize(myWriter, objectToSerialize); 
      myWriter.Close(); 
     } 
     catch (IOException ex) 
     { 
      Console.WriteLine("IO Exception ", ex.Message); 
      return false; 
     } 
     return true; 
    } 

文件狗的繼承。類中沒有xml標籤。

[XmlRoot(ElementName="Animal")] 
public abstract class Animal : IAnimal 
{ 

    /// <summary> 
    /// Id of animal 
    /// </summary> 
    private string id; 
    public string ID 

........ 

[XmlRoot(ElementName = "Animals")] 
public abstract class Mammal : Animal 
{ 


    public int NumberofTeeth { get; set; } 

........ 

[XmlRoot(ElementName="Dog")] 
public class Dog : Mammal 
{ 

    /// <summary> 
    /// Constructor - Create an instance of a Dog 
    /// </summary> 
    public Dog() 
    { 
    } 
........ 

回答

12

如果你想有對象的列表和它們序列爲基礎類型的列表,那麼你需要告訴串行什麼樣的具體類型是可能的。

所以,如果你想放一隻狗和一隻貓對象插入到動物名錄,你將需要標記添加到動物類,如下所示

[XmlInclude(typeof(Cat))] 
[XmlInclude(typeof(Dog))] 
[XmlRoot(ElementName="Animal")] 
public abstract class Animal : IAnimal 
+0

你剛纔救了我小時:) – user2130951