您好,我正在尝试序列化一个派生自类的对象数组,但我一直在使用 C# 时遇到相同的错误。非常感谢任何帮助。
显然,为了本文的目的,这个示例已经按比例缩小,在现实世界中,Shape 将包含大量不同的形状。
程序.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");
}
}
}
形状.cs
namespace XMLInheritTests
{
public abstract class Shape
{
public Shape() { }
public int area;
public int edges;
}
}
方形.cs
namespace XMLInheritTests
{
public class Square : Shape
{
public int iSize;
public Square() { }
public Square(int size)
{
iSize = size;
edges = 4;
area = size * size;
}
}
}
错误: System.InvalidOperationException:类型 XMLInheritTests.Square 不是预期的。使用 XmlInclude 或 SoapInclude 属性指定静态未知的类型。
在 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterShapeA rray.Write2_Shape(String n, String ns, Shape o, Boolean isNullable, Boolean need 类型)
在 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterShapeA rray.Write3_ArrayOfShape(对象o)
非常感谢
最佳答案
[XmlInclude(typeof(Square))]
public abstract class Shape {...}
(对所有已知子类型重复)
如果类型仅在运行时已知,您可以将它们提供给 XmlSerializer
构造函数,但是:那么缓存和重用该序列化程序实例是重要的;否则,您将大量使用动态创建的程序集。当您使用仅接受 Type
的构造函数时,它会自动执行此操作,但不会为其他重载执行此操作。
关于派生类的 C# XML 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3326481/