派生类的 C# XML 序列化

标签 c# xml class derived

您好,我正在尝试序列化一个派生自类的对象数组,但我一直在使用 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/

相关文章:

c# - 从巨大的文本文件中读取特定行(c# 4.0)

xml - 寻找 XSLT 库来创建 SVG 图表

c++ - 具有相同类名的变量?

C++ 管理对象

c++ - 我如何跟踪(枚举)实现接口(interface)的所有类

c# - XAML 中的动画按钮背景颜色

c# - 从 linq 中选择单个值

c# - Ormlite 不会将日期时间从 SQL Server 映射到 C#?

html - XPath选择文本,但某些部分除外

c# - 遍历XmlNodeList,值始终相同