DataContractSerializer的,KnownType和继承(DataContractS

2019-07-30 18:41发布

我读过有关已知类型的许多文章和我相信的我的例子应该工作。 但事实并非如此。 我越来越对反序列化下面的例外,不明白为什么:

误差在第1个位置2期待元件“A”从命名空间“ http://schemas.datacontract.org/2004/07/ConsoleApplication2 ” ..遇到“元素”与名称“C”,命名空间“ HTTP://模式.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);
        }
    }
}

我在想什么?

Answer 1:

改变你创建序列化的方式。 使用:

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

代替a.GetType();

有用。 所生成的XML是不同的 - 是这样的:

<C> ...

现在是:

<A i:type="C"> ...


文章来源: DataContractSerializer, KnownType and inheritance