首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataContractSerializer、KnownType和继承

DataContractSerializer、KnownType和继承
EN

Stack Overflow用户
提问于 2009-07-24 13:13:24
回答 1查看 5.3K关注 0票数 8

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

第1行位置% 2出错。应为命名空间‘http://schemas.datacontract.org/2004/07/ConsoleApplication2’中的元素'A‘。遇到名为'C‘、命名空间为'http://schemas.datacontract.org/2004/07/ConsoleApplication2’的'Element‘。

代码语言:javascript
复制
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);
        }
    }
}

我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-07-24 13:27:06

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

代码语言:javascript
复制
var serializer = new DataContractSerializer(typeof(A));

代替a.GetType();

它起作用了。生成的Xml是不同的-是这样的:

代码语言:javascript
复制
<C> ...

现在是:

代码语言:javascript
复制
<A i:type="C"> ...
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1177555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档