17

こんにちは、クラスから派生したオブジェクトの配列をシリアル化しようとしていますが、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;
        }
    }
}

エラー: System.InvalidOperationException: XMLInheritTests.Square 型は予期されていませんでした。XmlInclude または SoapInclude 属性を使用して、静的に認識されていない型を指定します。

Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterShapeA 配列.Write2_Shape (文字列 n、文字列 ns、形状 o、ブール値 isNullable、ブール値の型が必要) で

Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterShapeA 配列.Write3_ArrayOfShape (オブジェクト o) で

どうもありがとう

4

2 に答える 2

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

(すべての既知のサブタイプについて繰り返します)

型が実行時にしかわからない場合は、それらをXmlSerializerコンストラクターに提供できますが、その場合、そのシリアライザー インスタンスをキャッシュして再利用することが重要です。そうしないと、動的に作成されたアセンブリが出血します。のみを取るコンストラクターを使用すると、これは自動的に行われますがType、他のオーバーロードの場合はそうではありません。

于 2010-07-24T19:15:50.917 に答える
3

解決:

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

于 2010-07-24T19:36:45.103 に答える