2008-11-14 19 views
12

¿Cómo serializo un 'Tipo'?Cómo XML Serializar un 'Tipo'

Quiero serializar en XML un objeto que tiene una propiedad que es un tipo de objeto. La idea es que cuando se deserialice puedo crear un objeto de ese tipo.

public class NewObject 
{ 
} 

[XmlRoot] 
public class XmlData 
{ 
    private Type t; 

    public Type T 
    { 
     get { return t; } 
     set { t = value; } 
    } 
} 
    static void Main(string[] args) 
    { 
     XmlData data = new XmlData(); 
     data.T = typeof(NewObject); 
     try 
     { 
      XmlSerializer serializer = new XmlSerializer(typeof(XmlData)); 
      try 
      { 
       using (FileStream fs = new FileStream("test.xml", FileMode.Create)) 
       { 
        serializer.Serialize(fs, data); 
       } 
      } 
      catch (Exception ex) 
      { 

      } 
     } 
     catch (Exception ex) 
     { 

     } 
    } 

me sale esta excepción: "El tipo ConsoleApplication1.NewObject no se espera que el uso del XmlInclude o atributo SoapInclude para especificar los tipos que no son conocidos de forma estática.".

¿Dónde pongo [XmlInclude]? ¿Esto es posible?

Respuesta

3

La serialización XML serializa solo los campos públicos y los valores de las propiedades de un objeto en una secuencia XML. La serialización XML no incluye información de tipo. Por ejemplo, si tiene un objeto Libro que existe en el espacio de nombres de la Biblioteca, no hay garantía de que se deserialice en un objeto del mismo tipo.

Fuente: MSDN: Introducing XML Serialization

+0

pero en la pregunta T es público. –

3

usted podría implementar la interfaz IXmlSerializable y utilizar Type.FullName (también puede ser necesario Type.AssemblyQualifiedName) para la serialización y la deserialización de Assembly.GetType(string) para el tipo de elemento.

3

Terminé convirtiendo el nombre de Tipo en una cadena para guardarlo en XML.

Cuando deserializo, cargo todas las DLL y guardo el nombre del tipo y escriba en un diccionario. Cuando cargo el XML con el Nombre del Tipo, puedo buscar el nombre en la clave del diccionario y conocer el tipo en función del valor del diccionario.

1

El problema es que el tipo de XmlData.T es en realidad "System.RuntimeType" (una subclase de Tipo), que desafortunadamente no es pública. Esto significa que no hay forma de decirle a la serialización qué tipos esperar. Sugiero solo serializar el nombre del tipo, o nombre completo como lo sugiere Jay Bazuzi.

1

feo, pero funciona. Cree una clase que incluya el tipo de objeto y la cadena serializada.

ex

Class dummie 
{ 
    Type objType; 
    string xml; 
} 
17

Type clase no se puede serializar porque System.RuntimeType no es accesible a nuestro código, se trata de un tipo CLR interna. Puede solucionar esto utilizando el nombre del tipo, como este:

public class c 
{  
    [XmlIgnore] 
    private Type t; 
    [XmlIgnore] 
    public Type T { 
     get { return t; } 
     set { 
       t = value; 
       tName = value.AssemblyQualifiedName; 
      } 
    } 

    public string tName{ 
     get { return t.AssemblyQualifiedName; } 
     set { t = Type.GetType(value);} 
    } 
} 
+1

Para que el XML sea más bonito, puede agregar un atributo '[XmlElement (ElementName =" T ")]' a la propiedad 'tName'. – derkyjadex

+1

Dos cosas: [XmlIgnore] no es necesario en el campo privado, y el T setter no necesita actualizar el nombre. –

Cuestiones relacionadas