Привет я пытаюсь сериализировать массив объектов, которые получены из класса, и я продолжаю поражать ту же ошибку с помощью 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),
Большое спасибо
[XmlInclude(typeof(Square))]
public abstract class Shape {...}
(повторить для всех известных подтипов)
Если типы известны только во время выполнения, вы можете предоставить их конструктору XmlSerializer
, но: тогда важно кэшировать и повторно использовать экземпляр сериализатора; иначе вы будете терять динамически создаваемые сборки. Это происходит автоматически при использовании конструктора, который просто принимает Type
, но не для других перегрузок.
Решение:
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