.net - DataContractSerializer、KnownType 和继承

标签 .net serialization datacontractserializer known-types

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

第 1 行位置 2 中的错误。需要来自命名空间“http://schemas.datacontract.org/2004/07/ConsoleApplication2”的元素“A” '.. 遇到名称为 'C'、命名空间为 'http://schemas.datacontract.org/2004/07/ConsoleApplication2 的 'Element' '。

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);
        }
    }
}

我错过了什么?

最佳答案

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

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

而不是 a.GetType();

有用。生成的 Xml 是不同的 - 是这样的:
<C> ...

现在是:
<A i:type="C"> ...

关于.net - DataContractSerializer、KnownType 和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1177555/

相关文章:

.net - 使用 MSBuild 复制分隔文件列表

.net - 枚举序列化 Json 与 XML

c++ - 使用 Cereal 序列化/反序列化 SFML Vectors 类

c# - 使用 DataContractSerializer 时可以初始化只读字段吗?

c# - 如何在 .NET 中自定义 JSON 枚举的反序列化?

c# - 如何使用反射调用方法并传递编译时类型未知的参数?

c# - 需要自定义 .NET 应用程序搜索解决方案

c# - Xml 反序列化在空元素上失败

c# - 在为 WCF 服务创建代理时如何删除指定的字段?

asp.net - 如何将下拉列表绑定(bind)到 Dictionary<char, string> 类型的数据源?