6

I am failing to save a list of Animals to disk with XML serialization.

I am getting Exception:Thrown: "The type AnimalLibrary.Animals.Mammals.Dog was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically." (System.InvalidOperationException)

If I try the commented code with the "Dog" it will work just as expected and the XML is generated. But the same dog sent in as the only element in the List does not work.

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

Files for inheritance of the dog. There are no xml tags inside the classes.

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

Change your where condition to this. Also print it before executing and correct the number ' used here.

WHERE t.TicketDate BETWEEN '''+ Convert(varchar,@DateFrom) +'''' AND''' + Convert(varchar,@DateTo)+'''' AND''' + @ColumName +''''='''+ Convert(varchar,@ColumID)+''''

4

1 に答える 1

13

オブジェクトのリストを取得し、それらを基本型のリストとしてシリアル化する場合は、どのような具体的な型が可能かをシリアライザーに伝える必要があります。

したがって、Dog オブジェクトと Cat オブジェクトを Animal リストに入れたい場合は、次のように Animal クラスにマークアップを追加する必要があります。

[XmlInclude(typeof(Cat))]
[XmlInclude(typeof(Dog))]
[XmlRoot(ElementName="Animal")]
public abstract class Animal : IAnimal
于 2013-10-23T09:15:00.927 に答える