【问题标题】:DataContractSerializer, KnownType and inheritanceDataContractSerializer、KnownType 和继承
【发布时间】:2010-11-13 17:38:58
【问题描述】:

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

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

我错过了什么?

【问题讨论】:

    标签: .net serialization datacontractserializer known-types


    【解决方案1】:

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

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

    而不是a.GetType();

    它有效。生成的 Xml 是不同的 - 是这样的:

    <C> ...
    

    现在是:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-07
      • 2015-12-09
      相关资源
      最近更新 更多