2009-07-24 6 views
8

Ho letto molti articoli sui tipi noti e credo che il mio esempio dovrebbe funzionare. Ma non è così. Sto ottenendo la seguente eccezione sulla deserializzazione e non capisco perché:DataContractSerializer, KnownType ed ereditarietà

Errore nella posizione della riga 1 2. Elemento in attesa 'A' dallo spazio dei nomi 'http://schemas.datacontract.org/2004/07/ConsoleApplication2' .. Encountered 'Elemento' con nome 'C', spazio dei nomi '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); 
     } 
    } 
} 

Cosa mi manca?

risposta

11

Cambia il modo in cui si crea il serializzatore. Utilizzare:

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

anziché a.GetType();

Funziona. L'XML generato è diverso - è stato qualcosa di simile:

<C> ... 

e ora è:

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

Grazie mille! Funziona veramente. – UserControl