2009-07-24 25 views
8

私は既知の型に関する多くの記事を読んでいます。私の例はうまくいくはずです。しかし、それはしません。デシリアライザで次の例外が発生し、その理由を理解できません:DataContractSerializer、KnownTypeおよび継承

1行目の位置にエラーがあります。名前空間 '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); 
     } 
    } 
} 

何が欠けていますか?

答えて

11

シリアライザの作成方法を変更します。 a .GetType()の代わりに

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

の代わりに使用してください。

これは機能します。生成されたXMLは異なっている - このようなものだった:

<C> ... 

となりました:

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

どうもありがとう!それは実際に動作します。 – UserControl

関連する問題