Сериализация XML C# производных классов

Привет я пытаюсь сериализировать массив объектов, которые получены из класса, и я продолжаю поражать ту же ошибку с помощью c#. Любая справка очень ценится.

очевидно, этот пример был уменьшен в целях этого сообщения в Форме реального мира, будет содержать множество различных форм.

Program.cs

namespace XMLInheritTests
{
    class Program
    {
        static void Main(string[] args)
        {
            Shape[] a = new Shape[1] { new Square(1) };

            FileStream fS = new FileStream("C:\\shape.xml",
                                        FileMode.OpenOrCreate);
            XmlSerializer xS = new XmlSerializer(a.GetType());
            Console.WriteLine("writing");
            try
            {
                xS.Serialize(fS, a);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.InnerException.ToString());
                Console.ReadKey();
            }
            fS.Close();
            Console.WriteLine("Fin");
        }
    }
}

Shape.cs

namespace XMLInheritTests
{
    public abstract class Shape
    {
        public Shape() { }
        public int area;
        public int edges;
    }
}

Square.cs

namespace XMLInheritTests
{
    public  class  Square : Shape
    {
        public int iSize;
        public Square() { }

        public Square(int size)
        {
            iSize = size;
            edges = 4;
            area = size * size;
        }
    }
}

Ошибка: Система. InvalidOperationException: тип XMLInheritTests. Квадрат не ожидался. Используйте атрибут XmlInclude или SoapInclude для определения типов, которые не известны статически.

в Microsoft. Xml. Сериализация. GeneratedAssembly. XmlSerializationWriterShapeA rray. Write2_Shape (Представляют n в виде строки, Строка не уточнено, Форма o, булевская переменная isNullable, булевская переменная, нужен Тип),

в Microsoft. Xml. Сериализация. GeneratedAssembly. XmlSerializationWriterShapeA rray. Write3_ArrayOfShape (Возражают o),

Большое спасибо

15
задан 111111 24 July 2010 в 19:13
поделиться

2 ответа

[XmlInclude(typeof(Square))]
public abstract class Shape {...}

(повторить для всех известных подтипов)

Если типы известны только во время выполнения, вы можете предоставить их конструктору XmlSerializer, но: тогда важно кэшировать и повторно использовать экземпляр сериализатора; иначе вы будете терять динамически создаваемые сборки. Это происходит автоматически при использовании конструктора, который просто принимает Type, но не для других перегрузок.

23
ответ дан 1 December 2019 в 02:45
поделиться

Решение:

class Program
    {
        static void Main(string[] args)
        {
            Shape[] a = new Shape[2] { new Square(1), new Triangle() };

            FileStream fS = new FileStream("C:\\shape.xml",FileMode.OpenOrCreate);

            //this could be much cleaner
            Type[] t = { a[1].GetType(), a[0].GetType() };


            XmlSerializer xS = new XmlSerializer(a.GetType(),t);
            Console.WriteLine("writing");
            try
            {
                xS.Serialize(fS, a);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.InnerException.ToString());
                Console.ReadKey();
            }
            fS.Close();
            Console.WriteLine("Fin");
        }
    }

namespace XMLInheritTests
{
    [XmlInclude(typeof(Square))]
    [XmlInclude(typeof(Triangle))]
    public abstract class Shape
    {
        public Shape() { }
        public int area;
        public int edges;
    }
}

Спасибо; не сомневаюсь, что очень скоро у меня возникнет другая проблема :S

3
ответ дан 1 December 2019 в 02:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: