DataContractSerializer的,KnownType和继承DataContractSerializer、KnownType

2023-09-04 22:48:57 作者:人帅是非多

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

I've read many articles about known types and i belive my example should work. But it doesn't. I'm getting the following exception on deserialization and don't understand why:

在行错误1从命名空间期望元素A位置2http://schemas.datacontract.org/2004/07/ConsoleApplication2'..遇到元素名为'C',命名空间http://schemas.datacontract.org/2004/07/ConsoleApplication2'.

Error in line 1 position 2. Expecting element 'A' from namespace 'http://schemas.datacontract.org/2004/07/ConsoleApplication2'.. Encountered 'Element' with name 'C', namespace '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);
    	}
    }
}

我在想什么?

What am i missing?

推荐答案

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

Change the way you create serializer. Use:

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

而不是a.GetType()

instead of a.GetType();

它的工作原理。所生成的XML是不同的 - 是这样的:

It works. The Xml that is generated is different - was something like this:

<C> ...

现在是:

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