2013-10-23 4 views
6

Ich kann eine Liste der Tiere nicht auf der Festplatte mit XML-Serialisierung speichern.XML-Serialisierung der Liste <Object>

Ich erhalte die Ausnahme: Geworfen: "Der Typ AnimalLibrary.Animals.Mammals.Dog wurde nicht erwartet. Verwenden Sie das XmlInclude oder SoapInclude Attribut, um Typen anzugeben, die nicht statisch bekannt sind." (System.InvalidOperationException)

Wenn ich den kommentierten Code mit dem "Hund" versuche, wird es wie erwartet funktionieren und das XML generiert. Aber derselbe Hund, der als einziges Element in die Liste geschickt wurde, funktioniert nicht.

[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 Serializer

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; 
    } 

Dateien für die Vererbung des Hundes. In den Klassen befinden sich keine XML-Tags.

[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() 
    { 
    } 
........ 

Antwort

12

Wenn Sie eine Liste von Objekten haben wollen und sie als eine Liste des Basistypen serialisiert, dann müssen Sie die Serializer sagen, welche Art von konkreten Typen möglich ist.

Also, wenn Sie einen Hund und eine Katze Objekt in die Tierliste setzen wollte würden Sie Markup auf die Tier Klasse hinzufügen müssen wie folgt

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

Du hast mich gerettet nur Stunden :) – user2130951

Verwandte Themen