8

私は既知のタイプに関する多くの記事を読みましたが、私の例はうまくいくはずです。しかし、そうではありません。デシリアライズで次の例外が発生しますが、その理由がわかりません。

1行目の位置2にエラーがあります。名前空間' http://schemas.datacontract.org/2004/07/ConsoleApplication2 'から要素'A'が必要です。..名前'C'、名前空間' http://schemasの'要素'が見つかりました。 .datacontract.org / 2004/07 /ConsoleApplication2 '。

using System;
using System.Runtime.Serialization;
using System.Xml;
using System.IO;

namespace ConsoleApplication2
{
    [DataContract][KnownType(typeof(C))]class A { }
    [DataContract]class C : A { }

    class Program
    {
        static void Main(string[] args)
        {
            A a = new C();
            string data;

            var serializer = new DataContractSerializer(a.GetType());
            using (var sw = new StringWriter())
            {
                using (var xw = new XmlTextWriter(sw))
                    serializer.WriteObject(xw, a);
                data = sw.ToString();
            }

            serializer = new DataContractSerializer(typeof(A));
            using (var sr = new StringReader(data))
            using (var xr = new XmlTextReader(sr))
                a = (A)serializer.ReadObject(xr);
        }
    }
}

私は何が欠けていますか?

4

1 に答える 1

11

シリアライザーの作成方法を変更します。使用する:

var serializer = new DataContractSerializer(typeof(A));

a.GetType(); の代わりに

できます。生成される Xml は異なります - 次のようなものでした:

<C> ...

そして今は:

<A i:type="C"> ...
于 2009-07-24T13:27:05.717 に答える