2009-07-24 35 views
8

J'ai lu de nombreux articles sur les types connus et je crois que mon exemple devrait fonctionner. Mais ce n'est pas le cas. Je reçois l'exception suivante sur la désérialisation et je ne comprends pas pourquoi:DataContractSerializer, KnownType et l'héritage

Erreur dans la ligne 1 position 2. Attendant élément 'A' de l'espace de noms 'http://schemas.datacontract.org/2004/07/ConsoleApplication2' .. 'Element' rencontré avec le nom 'C', espace de noms '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); 
     } 
    } 
} 

Que manque-t-il?

Répondre

11

Modifiez la façon dont vous créez le sérialiseur. Utilisation:

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

au lieu de a.GetType();

Cela fonctionne. Le Xml généré est différent - était quelque chose comme ceci:

<C> ... 

et est maintenant:

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

Merci beaucoup! Ça marche vraiment. – UserControl