DataContractSerializer,KnownType和继承

Use*_*rol 8 .net serialization datacontractserializer known-types

我读过很多关于已知类型的文章,我相信我的例子应该有用.但事实并非如此.我在反序列化时遇到以下异常,并且不明白为什么:

第1行位置出错2.期望命名空间' http://schemas.datacontract.org/2004/07/ConsoleApplication2 '中的元素'A' .遇到名为'C'的'Element',命名空间' 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

mac*_*kow 11

更改创建序列化程序的方式.使用:

var serializer = new DataContractSerializer(typeof(A));
Run Code Online (Sandbox Code Playgroud)

而不是a.GetType();

有用.生成的Xml是不同的 - 是这样的:

<C> ...
Run Code Online (Sandbox Code Playgroud)

现在是:

<A i:type="C"> ...
Run Code Online (Sandbox Code Playgroud)