代码之家  ›  专栏  ›  技术社区  ›  UserControl

DataContractSerializer、KnownType和继承

  •  8
  • UserControl  · 技术社区  · 15 年前

    我读过很多关于已知类型的文章,我相信我的示例应该有效。但事实并非如此。我在反序列化方面遇到以下异常,不明白原因:

    第1行位置2出错。需要命名空间中的元素“a” http://schemas.datacontract.org/2004/07/ConsoleApplication2 …遇到名为“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);
            }
        }
    }
    

    我错过了什么?

    1 回复  |  直到 15 年前
        1
  •  11
  •   Sam Holder    13 年前

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

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

    而不是.getType();

    它起作用了。生成的XML是不同的-如下所示:

    <C> ...
    

    现在是:

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