2009-07-24 14 views
8

He leído muchos artículos sobre tipos conocidos y creo que mi ejemplo debería funcionar. Pero no es así Obtengo la siguiente excepción sobre deserialización y no entiendo por qué:DataContractSerializer, KnownType y herencia

Error en la posición de la línea 1 2. Esperando el elemento 'A' del espacio de nombres 'http://schemas.datacontract.org/2004/07/ConsoleApplication2' .. 'Elemento' encontrado con el nombre 'C', espacio de nombres '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); 
     } 
    } 
} 

¿Qué me falta?

Respuesta

11

Cambia la forma de crear el serializador. Uso:

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

en lugar de a.GetType();

Funciona. El código XML que se genera es diferente - era algo como esto:

<C> ... 

y ahora es:

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

Muchas gracias! Realmente funciona. – UserControl

Cuestiones relacionadas