2013-10-23 94 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