2009-07-24 80 views
8

我已經閱讀了許多關於已知類型的文章,並且我相信我的例子應該可以工作。但事實並非如此。我越來越對反序列化下面的例外,不明白爲什麼:在第1行位置2DataContractSerializer,KnownType和繼承

錯誤的命名空間「http://schemas.datacontract.org/2004/07/ConsoleApplication2」 ..遇到「元素」名爲「C」期待元素「A」,命名空間'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); 
     } 
    } 
} 

我在想什麼?

回答

11

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

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

而不是a.GetType();

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

<C> ... 

,現在是:

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

非常感謝!真的行。 – UserControl 2009-07-24 13:30:01